рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░, рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╖рдп рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреАрд╡рд░реНрдбреНрд╕ рдЕрдХреНрд╕рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рдЕрд░реНрде рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рд╖рдп рди рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдкрд╣рд▓реВ рдХреЛ рдЕрдкрдиреА рд╕реНрдореГрддрд┐ рдореЗрдВ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдВрдХ рдореЗрдВ "рд▓реЙрдЧ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛" рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рдиреБрдХрд╕рд╛рди рдореЗрдВ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЙрддреНрддрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░реЗрдВред
var f = function() { this.x = 5; (function() { this.x = 3; })(); console.log(this.x); }; var obj = {x: 4, m: function() { console.log(this.x); }}; f(); new f(); obj.m(); new obj.m(); f.call(f); obj.m.call(f);
рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП рдЬрд╡рд╛рдм3
5
4
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
5
5
1. рдереНрдпреЛрд░реА
рдХрдИ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдХреАрд╡рд░реНрдб рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╕рдордЭ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ рдЦрд┐рдбрд╝рдХреА рд╣реИред
1.1ред рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓
function f() { console.log(this === window);
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди
f рдХреЗ рдЕрдВрджрд░
рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╣
рд╡рд┐рдВрдбреЛ рд╣реИ , Node.js рдореЗрдВ рдпрд╣
рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ )ред
рд╕реЗрд▓реНрдл-рдЗрдирд╡реЛрдХрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
(function () { console.log(this === window);
1.2ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ
function f() { this.x = 5; console.log(this === window);
рдирдП рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
1.3ред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рд╡рд┐рдзрд┐ рдореЗрдВ
var o = { f: function() { return this; } } console.log(of() === o);
рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ
рдпрд╣ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рдерд╛, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдп рд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ:
var o = { f: function() { return this; } } var o2 = {f: of}; console.log(of() === o);
1.4ред рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдХреЙрд▓ рдХреЗ рддрд░реАрдХреЗ
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЖрдкрдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЙрд╕ рддрд░реАрдХреЗ рд╕реЗ рд╣реИ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдХреНрдпрд╛ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛)ред
рд▓рд╛рдЧреВ рдХрд░реЗрдВ / рдХреЙрд▓ рдЕрдВрддрд░ function f(a,b,c) { return a * b + c; } f.call(f, 1, 2, 3);
рдЙрджрд╛рд╣рд░рдг:
function f() { } f.call(window);
рдЪрд╛рд▓рд╛рдХ:
function f() { console.log(this.toString());
2. рд╣рдо рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ
рд╣рдо рд╡рд┐рд╖рдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЕрд░реНрдЬрд┐рдд рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реЗ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ рдЦрд┐рдбрд╝рдХреА рд╣реИред
2.1ред рдЪ ()
var f = function() {
рдкрд░рд┐рдгрд╛рдо: 3
2.2ред рдирдпрд╛ f ();
var f = function() {
рдкрд░рд┐рдгрд╛рдо: 5
2.3ред obj.m ();
var obj = {x: 4, m: function() {
рдкрд░рд┐рдгрд╛рдо: 4
2.4ред new obj.m ();
var obj = {x: 4, m: function() {
рдкрд░рд┐рдгрд╛рдо: рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
2.5ред f.call (f);
var f = function() {
рдкрд░рд┐рдгрд╛рдо: 5
2.6ред obj.m.call (f);
var obj = {x: 4, m: function() {
рдкрд░рд┐рдгрд╛рдо: 5
рдзреНрдпрд╛рди рджреЗрдВ: рдпрджрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЙрдЧ 5 рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдВ
var f = function() { this.x = 5; (function() { this.x = 3; })(); console.log(this.x); }; var obj = {x: 4, m: function() { console.log(this.x); }}; obj.m.call(f);
рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп
рд╕рднреА рдорд┐рд▓рдХрд░ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВ3
5
4
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
5
5
рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ
рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐
рдпрд╣ рдХреАрд╡рд░реНрдб рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦреВрдВрдЧрд╛, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрди рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, jQuery- .pro)
PS рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ / рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ / рдХреБрдЫ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдкреАрдПрдо рдХреЛ рд▓рд┐рдЦреЗрдВ, рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдХрд░реВрдВрдЧрд╛ ред