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

рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдореЗрд╢рд╛ рджреЗрдЦреЗрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
1. jQuery.proxy - рд▓реЛрдХрдкреНрд░рд┐рдп jQuery рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг
2. Function.prototyp.bind - рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ 1.8.5 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдгред рдЖрдЗрдП рд╣рдо рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рдХрд░реАрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ) рдФрд░ рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдБ рдЬреЛ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреА рд╣реИрдВред


рдкрд░рд┐рдЪрдп


рдЧреБрдг x рдФрд░ рдкрджреНрдзрддрд┐ f рдпреБрдХреНрдд рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рдХрдВрд╕реЛрд▓ рдХреЛ рдорд╛рди .x рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
var object = { x: 3, f: function() { console.log(this.x); } } 

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдмрддрд╛рдпрд╛ рдерд╛, рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ .f () рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ рдХрдВрд╕реЛрд▓ рдирдВрдмрд░ 3 рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ 1 рд╕реЗрдХрдВрдб рдореЗрдВ рдЗрд╕ рдирдВрдмрд░ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 setTimeout(object.f, 1000); //  undefined //    тАФ    : setTimeout(function() { object.f(); }, 1000); //  3 

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

1. jQuery.proxy


 jQuery.proxy(function, context); jQuery.proxy(context, name); 

рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ jQuery рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╛рдЗрдВрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jQuery.proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
jQuery.proxy рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░, рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ ред JQuery.proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 setTimeout($.proxy(object.f, object), 1000); //  3 

рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рд╣реА рдХреЙрд▓рдмреИрдХ рдХреЛ рдХрдИ рдмрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рдмрдЬрд╛рдп
 setTimeout($.proxy(object.f, object), 1000); setTimeout($.proxy(object.f, object), 2000); setTimeout($.proxy(object.f, object), 3000); 

$ .proxy рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЪрд░ рдореЗрдВ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ
 var fn = $.proxy(object.f, object); setTimeout(fn, 1000); setTimeout(fn, 2000); setTimeout(fn, 3000); 


рдЖрдЗрдП рдЕрдм рд╣рдо рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо $ .proxy рдХреЗ рдЕрдВрджрд░ рджреЛ рдмрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ (рдкрд╣рд▓реА рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрджрд┐ , рджреВрд╕рд░реА рд╣реИ рддреЛ рдкреНрд░реЗрд╖рд┐рдд рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ )ред рд╢рд╛рдпрдж рдирдХрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ? рдЬрд╡рд╛рдм рд╣реИ рд╣рд╛рдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдкрд╛рд╕рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдХрд▓реНрдк $ .proxy рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ - рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 var fn = $.proxy(object, "f"); setTimeout(fn, 1000); 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдирд╛рдо рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

2. рдлрдВрдХреНрд╢рди.рдкреНрд░реЛрдЯрд╛рдЗрдк.рдмрд┐рдВрдж


 func.bind(context[, arg1[, arg2[, ...]]]) 


рдЪрд▓рд┐рдП Function.prototyp.bind рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ 1.8.5 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрдЧрддрддрд╛
рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ (рдЧреЗрдХреЛ): 4.0 (2)
рдХреНрд░реЛрдо: 7
рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░: 9
рдУрдкреЗрд░рд╛: 11.60
рд╕рдлрд╛рд░реА: 5.1.4

рдПрдореБрдЬрд┐рд▓рд╛ рдбреЗрд╡рд▓рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдПрдореБрд▓реЗрд╢рди рдлрдВрдХреНрд╢рди.рдкреНрд░реЛрдЯрд╛рдЗрдк.рдмрд┐рдВрдж
 Function.prototype.bind = function (oThis) { if (typeof this !== "function") { // closest thing possible to the ECMAScript 5 internal IsCallable function throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function () {}, fBound = function () { return fToBind.apply(this instanceof fNOP && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); }; fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; }; 


Function.prototyp.bind рдХреЗ 2 рдЙрджреНрджреЗрд╢реНрдп рд╣реИрдВ - рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рд╕реНрдерд┐рд░ рдмрдВрдзрди рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдмрд╛рдБрдз рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдлрд╝рдВрдХ рдХрд╣рддрд╛ рд╣реИред рдпрджрд┐ рддрд░реНрдХ arg1, arg2 ... рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╡реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВред

2.1ред рдкреНрд░рд╕рдВрдЧ рдмрдВрдзрди

рдмрд╛рдЗрдВрдб рдЯреВ рдмрд┐рдВрдб рдХрд╛ рд╕рдВрджрд░реНрдн рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 function f() { console.log(this.x); } var bound = f.bind({x: 3}); // bound -   - "",   this    {x:3} bound();//  3 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд░рд┐рдЪрдп рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 var object = { x: 3, f: function() { console.log(this.x); } } setTimeout(object.f.bind(object), 1000); //  3 


2.2ред рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЙрдкрдпреЛрдЧ

рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
 function f(x, y, z) { console.log(x + y + z); } var bound = f.bind(null, 3, 5); //     -    ,     this   f,      -      null bound(7); //  15 (3 + 5 + 7) bound(17); //  25 (3 + 5 + 17) 


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

2.3ред рдмрд╛рдЗрдВрдб рдлреАрдЪрд░реНрд╕

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдмрд╛рдЗрдВрдб ( рдПрдХ , рджреЛ ) рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ 2 рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рдереЗред
рдореИрдВрдиреЗ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рддрд╛рдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛред
рдЙрджрд╛рд╣рд░рдг (рдЙрддреНрддрд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ)
 function ClassA() { console.log(this.x, arguments) } ClassA.prototype.x = "fromProtoA"; var ClassB = ClassA.bind({x : "fromBind"}, "bindArg"); ClassB.prototype = {x : "fromProtoB" }; new ClassA("callArg"); new ClassB("callArg"); ClassB("callArg"); ClassB.call({x: "fromCall"}, 'callArg'); 

рдЙрддреНрддрд░
ProProtoA рд╕реЗ ["callArg"]
fromProtoA ["bindArg", "callArg"]
рдмрд┐рдВрдж рд╕реЗ ["bindArg", "callArg"]
рдмрд┐рдВрдж рд╕реЗ ["bindArg", "callArg"]

рдбрд┐рд╕реНрд╕реИрдореНрдмрд▓рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ - рдореИрдВ рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╛рдЗрдВрдб рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реВрдВрдЧрд╛ред

2.3.1ред рдЖрдВрддрд░рд┐рдХ рдЧреБрдг

Function.prototype.bind рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдг рдпрд╛ рдЖрдВрддрд░рд┐рдХ рдЧреБрдг [[рдХреЛрдб]], [[FormalParameters]] рдФрд░ [[рд╕реНрдХреЛрдк]] рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕реАрдорд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдордбреАрдПрди рд╕реЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг ) рд╕реЗ рдмрд╛рдЗрдВрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрдВрддрд░ рдХрд░рддреА рд╣реИред

2.3.2ред рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЖрд╡реЗрджрди рдХрд░реЗрдВ

рдХреЙрд▓ рдФрд░ рд▓рд╛рдЧреВ рддрд░реАрдХреЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:
 boundFn.[[Call]] = function (thisValue, extraArgs): var boundArgs = boundFn.[[BoundArgs]], boundThis = boundFn.[[BoundThis]], targetFn = boundFn.[[TargetFunction]], args = boundArgs.concat(extraArgs); return targetFn.[[Call]](boundThis, args); 

рдХреЛрдб рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ Value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕рдВрджрд░реНрдн рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдХреЙрд▓ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ!

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

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдпрд╣ рдПрдХ рдирдИ (рдирд┐рд░реНрдорд┐рдд) рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдмрд╛рдЗрдВрдб рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдХреЛ рдХреЗрд╡рд▓ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рд░реНрдорд╛рддрд╛ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдпрдорд┐рдд [[рдХреЙрд▓]] рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ ред
рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдпрджрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдпрд╣ рд░рд┐рдЯрд░реНрди рдирд╣реАрдВ рд╣реИ, рддреЛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдЖрдо рддреМрд░ рдкрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ рдФрд░ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ!

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд░реНрд╕ рдХрд░рдирд╛

 function ClassA() { console.log(this.x, arguments) } ClassA.prototype.x = "fromProtoA"; var ClassB = ClassA.bind({x : "fromBind"}, "bindArg"); //   2.3.1,         built-in  Function.prototype.bind //     bind (,   MDN)     ClassB.prototype = {x : "fromProtoB" }; //    -  bind     // : fromProtoA ["callArg"] new ClassA("callArg"); //   2.3.3 - this    .   bind    bindArg,         // : fromProtoA ["bindArg", "callArg"] //    bind   : fromBind ["bindArg", "callArg"]. new ClassB("callArg"); //   bind ,      {x : "fromBind"},   bindArg (  bind),  - "callArg" // : fromBind ["bindArg", "callArg"] ClassB("callArg"); //   2.3.2. ,     call  ,    bind   . // : fromBind ["bindArg", "callArg"] ClassB.call({x: "fromCall"}, 'callArg'); 


рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдлрдВрдХреНрд╢рди.рдкреНрд░реЛрдЯрд╛рдЗрдк.рдЗрдВрдб рдХреЗ рдХрд╛рдо рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд┐рдпрд╛, рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг (рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ / рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ / рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рддреЛ рдкреАрдПрдо рдХреЛ рд▓рд┐рдЦреЗрдВ, рд╕рд╣реА

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


All Articles