renovations

This commit is contained in:
Ilya Kantor 2015-01-14 10:23:45 +03:00
parent c7d4c7e3ff
commit e1948130f6
170 changed files with 1496 additions and 1161 deletions

View file

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

View file

@ -0,0 +1,16 @@
# Повторный bind
[importance 5]
Что выведет этот код?
```js
function f() {
alert(this.name);
}
f = f.bind( {name: "Вася"} ).bind( {name: "Петя" } );
f();
```