рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдореЗрд╢рд╛ рджреЗрдЦреЗрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
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);
рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рд╣реЛред рд╣рдореЗрд╢рд╛
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ
рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ
1. jQuery.proxy
jQuery.proxy(function, context); jQuery.proxy(context, name);
рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ jQuery рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╛рдЗрдВрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jQuery.proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
jQuery.proxy рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░, рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрджрд░реНрдн
рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛
рд╣реИ ред JQuery.proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
setTimeout($.proxy(object.f, object), 1000);
рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рд╣реА рдХреЙрд▓рдмреИрдХ рдХреЛ рдХрдИ рдмрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рдмрдЬрд╛рдп
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") {
Function.prototyp.bind рдХреЗ 2 рдЙрджреНрджреЗрд╢реНрдп рд╣реИрдВ - рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рд╕реНрдерд┐рд░ рдмрдВрдзрди рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдмрд╛рдБрдз рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдлрд╝рдВрдХ рдХрд╣рддрд╛ рд╣реИред рдпрджрд┐ рддрд░реНрдХ arg1, arg2 ... рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╡реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВред
2.1ред рдкреНрд░рд╕рдВрдЧ рдмрдВрдзрди
рдмрд╛рдЗрдВрдб рдЯреВ рдмрд┐рдВрдб рдХрд╛ рд╕рдВрджрд░реНрдн рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
function f() { console.log(this.x); } var bound = f.bind({x: 3});
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд░рд┐рдЪрдп рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
var object = { x: 3, f: function() { console.log(this.x); } } setTimeout(object.f.bind(object), 1000);
2.2ред рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЙрдкрдпреЛрдЧ
рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
function f(x, y, z) { console.log(x + y + z); } var bound = f.bind(null, 3, 5);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рд╕рд╛рд░ рд╕рд░рд▓ рд╣реИ - рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛, рдмрд╛рдЗрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХреЛрдВ рдХреЛ "рдареАрдХ рдХрд░рдирд╛"ред
рдпрд╣ рд▓реЗрдЦ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ...
рдмрд╛рдЗрдВрдб рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ
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');
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдлрдВрдХреНрд╢рди.рдкреНрд░реЛрдЯрд╛рдЗрдк.рдЗрдВрдб рдХреЗ рдХрд╛рдо рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд┐рдпрд╛, рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг (рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ / рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ / рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рддреЛ рдкреАрдПрдо рдХреЛ рд▓рд┐рдЦреЗрдВ, рд╕рд╣реА