1.8 KiB
1.8 KiB
Ответ: "Вася"
.
//+ run
function f() {
alert(this.name);
}
f = f.bind( {name: "Вася"} ).bind( {name: "Петя"} );
f(); // Вася
Первый вызов f.bind(..Вася..)
возвращает "обёртку", которая устанавливает контекст для f
и передаёт вызов f
.
Следующий вызов bind
будет устанавливать контекст уже для этой обёртки, это ни на что не влияет.
Чтобы это проще понять, используем наш собственный вариант bind
вместо встроенного:
function bind(func, context) {
return function() {
return func.apply(context, arguments);
};
}
Код станет таким:
function f() {
alert(this.name);
}
f = bind(f, {name: "Вася"} ); // (1)
f = bind(f, {name: "Петя"} ); // (2)
f(); // Вася
Здесь видно, что первый вызов bind
, в строке (1)
, возвращает обёртку вокруг f
, которая выглядит так (выделена):
function bind(func, context) {
*!*
return function() {
return func.apply(context, arguments);
};
*/!*
}
В этой обёртке нигде не используется this
, только func
и context
. Посмотрите на код, там нигде нет this
.
Поэтому следующий bind
в строке (2)
, который выполняется уже над обёрткой и фиксирует в ней this
, ни на что не влияет. Какая разница, что будет в качестве this
в функции, которая этот this
не использует?