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