en.javascript.info/01-js/06-objects-more/05-bind/03-second-bind/solution.md
Ilya Kantor f301cb744d init
2014-10-26 22:10:13 +03:00

55 lines
1.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Ответ: `"Вася"`.
```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` не использует?