рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреАрд╡рд░реНрдб - рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рдВрджрд░реНрдн рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕реАрдЦрддрд╛ рд╣реИ

рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░, рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╖рдп рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреАрд╡рд░реНрдбреНрд╕ рдЕрдХреНрд╕рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рдЕрд░реНрде рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рд╖рдп рди рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдкрд╣рд▓реВ рдХреЛ рдЕрдкрдиреА рд╕реНрдореГрддрд┐ рдореЗрдВ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдВрдХ рдореЗрдВ "рд▓реЙрдЧ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛" рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рдиреБрдХрд╕рд╛рди рдореЗрдВ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЙрддреНрддрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░реЗрдВред

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); // true } f(); 


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди f рдХреЗ рдЕрдВрджрд░ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╣ рд╡рд┐рдВрдбреЛ рд╣реИ , Node.js рдореЗрдВ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ )ред

рд╕реЗрд▓реНрдл-рдЗрдирд╡реЛрдХрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

 (function () { console.log(this === window); // true })(); 


1.2ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ

 function f() { this.x = 5; console.log(this === window); // false } var o = new f(); console.log(ox === 5); // true 


рдирдП рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

1.3ред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рд╡рд┐рдзрд┐ рдореЗрдВ

 var o = { f: function() { return this; } } console.log(of() === o); // true 


рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рдерд╛, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдп рд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ:

 var o = { f: function() { return this; } } var o2 = {f: of}; console.log(of() === o);//true console.log(o2.f() === o2);//true 


1.4ред рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдХреЙрд▓ рдХреЗ рддрд░реАрдХреЗ

рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЖрдкрдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЙрд╕ рддрд░реАрдХреЗ рд╕реЗ рд╣реИ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдХреНрдпрд╛ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛)ред

рд▓рд╛рдЧреВ рдХрд░реЗрдВ / рдХреЙрд▓ рдЕрдВрддрд░
 function f(a,b,c) { return a * b + c; } f.call(f, 1, 2, 3); //    ; var args = [1,2,3]; f.apply(f, args); // //     ; //      <b>f</b>   a = 1, b = 2, c = 3; 



рдЙрджрд╛рд╣рд░рдг:

 function f() { } f.call(window); // this   f     window f.call(f); //this  f    f 


рдЪрд╛рд▓рд╛рдХ:

 function f() { console.log(this.toString()); // 123 } f.call(123); // this   f     Number   123 


2. рд╣рдо рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ


рд╣рдо рд╡рд┐рд╖рдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЕрд░реНрдЬрд┐рдд рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реЗ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ рдЦрд┐рдбрд╝рдХреА рд╣реИред

2.1ред рдЪ ()

 var f = function() { //  f      - f(), //  this     this.x = 5; // window.x = 5; //   1.1  ,     this      (function() { this.x = 3; // window.x = 3 })(); console.log(this.x); // console.log(window.x) }; 


рдкрд░рд┐рдгрд╛рдо: 3

2.2ред рдирдпрд╛ f ();

 var f = function() { //  f      new, //  this     (   object) this.x = 5; // object.x = 5; //   1.1  ,     this     (function() { this.x = 3; // window.x = 3 })(); console.log(this.x); // console.log(object.x) }; 

рдкрд░рд┐рдгрд╛рдо: 5

2.3ред obj.m ();

 var obj = {x: 4, m: function() { //   1.3 ,  this === obj, console.log(this.x); // console.log(obj.x) } }; 

рдкрд░рд┐рдгрд╛рдо: 4

2.4ред new obj.m ();

 var obj = {x: 4, m: function() { //   1.2 ,  this      //         this.x,   - undefined console.log(this.x); } }; 


рдкрд░рд┐рдгрд╛рдо: рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд

2.5ред f.call (f);

 var f = function() { //  f     call //    call    ( ) f,  //  this   f this.x = 5; // fx = 5; //   1.1  ,     this     (function() { this.x = 3; // window.x = 3 })(); console.log(this.x); // console.log(fx) }; 

рдкрд░рд┐рдгрд╛рдо: 5

2.6ред obj.m.call (f);

 var obj = {x: 4, m: function() { //      call //     f //  this    f //    fx    5,   5 console.log(this.x); // console.log(fx) } }; 


рдкрд░рд┐рдгрд╛рдо: 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 рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ / рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ / рдХреБрдЫ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдкреАрдПрдо рдХреЛ рд▓рд┐рдЦреЗрдВ, рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдХрд░реВрдВрдЧрд╛ ред

Source: https://habr.com/ru/post/In149516/


All Articles