You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Обычно это также работает, но может не сработать в более сложных ситуациях, когда `user` может быть перезаписан между моментами запроса и выполнения`() => user.loginOk()`.
41
+
Обычно это также работает и хорошо выглядит. Но может не сработать в более сложных ситуациях, когда значение переменной `user` может измениться между вызовом `askPassword` и выполнением`() => user.loginOk()`.
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/10-bind/article.md
+8-8Lines changed: 8 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,7 @@ libs:
5
5
6
6
# Привязка контекста к функции
7
7
8
-
При использовании `setTimeout` с методами объекта (или при передаче методов объекта) возникает известная проблема: «потеря `this`».
8
+
При использовании `setTimeout` с методами объекта (или при передаче методов объекта) возникает известная проблема: "потеря `this`".
9
9
10
10
Внезапно, `this` просто перестает работать правильно. Такая ситуация типична для новичков, но также случается и с опытными разработчиками.
11
11
@@ -92,7 +92,7 @@ user = { sayHi() { alert("Другой пользователь в 'setTimeout'!
92
92
93
93
## Решение 2: привязать контекст с помощью bind
94
94
95
-
В современном JavaScript у функций есть встроенный метод [bind](mdn:js/Function/bind), который позволяет исправить`this`.
95
+
В современном JavaScript у функций есть встроенный метод [bind](mdn:js/Function/bind), который позволяет зафиксировать`this`.
96
96
97
97
Базовый синтаксис `bind`:
98
98
@@ -101,7 +101,7 @@ user = { sayHi() { alert("Другой пользователь в 'setTimeout'!
101
101
let boundFunc =func.bind(context);
102
102
```
103
103
104
-
Результатом вызова `func.bind(context)` является подобный функции специальный «экзотический объект», который вызывается как функция и прозрачно передает вызов в `func`, при этом устанавливая `this=context`.
104
+
Результатом вызова `func.bind(context)` является особый "экзотический объект" (термин взят из спецификации), который вызывается как функция и прозрачно передает вызов в `func`, при этом устанавливая `this=context`.
105
105
106
106
Другими словами, вызов `boundFunc` подобен вызову `func` с фиксированным `this`.
107
107
@@ -122,7 +122,7 @@ funcUser(); // Вася
122
122
*/!*
123
123
```
124
124
125
-
Здесь `func.bind(user)` - это «связанный вариант»`func`, с фиксированным `this=user`.
125
+
Здесь `func.bind(user)` - это "связанный вариант"`func`, с фиксированным `this=user`.
126
126
127
127
Все аргументы передаются исходному методу `func` "как есть", например:
128
128
@@ -162,9 +162,9 @@ sayHi(); // Привет, Вася!
162
162
setTimeout(sayHi, 1000); // Привет, Вася!
163
163
```
164
164
165
-
В строке `(*)` мы берем метод `user.sayHi` и привязываем его к `user`. `SayHi` - это «связанная» функция, которая может быть вызвана отдельно или передана в `setTimeout` (контекст всегда будет правильным).
165
+
В строке `(*)` мы берем метод `user.sayHi` и привязываем его к `user`. Теперь `SayHi` - это "связанная" функция, которая может быть вызвана отдельно или передана в `setTimeout` (контекст всегда будет правильным).
166
166
167
-
Здесь мы можем видеть, что `bind` исправляет только `this`, а аргументы передаются «как есть»:
167
+
Здесь мы можем видеть, что `bind` исправляет только `this`, а аргументы передаются "как есть":
168
168
169
169
```js run
170
170
let user = {
@@ -196,6 +196,6 @@ for (let key in user) {
196
196
197
197
## Итого
198
198
199
-
Метод `func.bind(context, ...args)` возвращает «связанный вариант» функции `func`, который фиксирует контекст `this` и первые аргументы, если они заданы.
199
+
Метод `func.bind(context, ...args)` возвращает "связанный вариант" функции `func`, который фиксирует контекст `this` и первые аргументы, если они заданы.
200
200
201
-
Обычно мы применяем `bind`, для исправления `this` в методе объекта, чтобы мы могли передать его куда-нибудь. Например, в `setTimeout`. В современной разработке существуют и другие причины для «связывания», мы встретимся с ними позже.
201
+
Обычно мы применяем `bind`, для исправления `this` в методе объекта, чтобы мы могли передать его куда-нибудь. Например, в `setTimeout`. В современной разработке существуют и другие причины для "связывания", мы встретимся с ними позже.
0 commit comments