renovations
This commit is contained in:
parent
c7d4c7e3ff
commit
e1948130f6
170 changed files with 1496 additions and 1161 deletions
55
1-js/6-objects-more/7-bind/3-second-bind/solution.md
Normal file
55
1-js/6-objects-more/7-bind/3-second-bind/solution.md
Normal 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` не использует?
|
16
1-js/6-objects-more/7-bind/3-second-bind/task.md
Normal file
16
1-js/6-objects-more/7-bind/3-second-bind/task.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
# Повторный bind
|
||||
|
||||
[importance 5]
|
||||
|
||||
Что выведет этот код?
|
||||
|
||||
```js
|
||||
function f() {
|
||||
alert(this.name);
|
||||
}
|
||||
|
||||
f = f.bind( {name: "Вася"} ).bind( {name: "Петя" } );
|
||||
|
||||
f();
|
||||
```
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue