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
В коде выше `cachingDecorator` -*декоратор*: это специальная функция, которая принимает другую функцию и изменяет ее поведение.
46
+
В коде выше `cachingDecorator` -- это *декоратор*, специальная функция, которая принимает другую функцию и изменяет её поведение.
47
47
48
-
Идея состоит в том, что мы можем вызвать `cachingDecorator` с любой функцией, в результате чего мы получим кеширующую обертку. Это здорово, т.к. у нас может быть множество функций, использующих такой функционал, и все, что нам нужно сделать - это применить к ним `cachingDecorator`.
48
+
Идея состоит в том, что мы можем вызвать `cachingDecorator` с любой функцией, в результате чего мы получим кеширующую обёртку. Это здорово, т.к. у нас может быть множество функций, использующих такой функционал, и все, что нам нужно сделать - это применить к ним `cachingDecorator`.
49
49
50
50
Отделяя кеширующий код от основного кода, мы также сохраняем чистоту и простоту последнего.
Как мы видим обертка возвращает результат выполнения `func(x)` "как есть". Из внешнего кода обернутая функция `slow` по-прежнему делает то же самое. Обертка всего добавляет к её поведению аспект кэширования.
58
+
Как мы видим обертка возвращает результат выполнения `func(x)` "как есть". Из внешнего кода обернутая функция `slow` по-прежнему делает то же самое. Обертка всего добавляет к её поведению аспект кеширования.
59
59
60
60
Подводя итог, можно выделить несколько преимуществ использования отдельной `cachingDecorator` вместо изменения кода самой `slow`:
Ошибка возникает в строке `(*)`. Функция пытается получить доступ к `this.someMethod` и завершается с ошибкой. Видите почему?
112
112
113
-
Причина в том, что в строке `(**)` декоратор вызывает оригинальную функцию как `func(x)`, а в этом случае функция получает `this=undefined`.
113
+
Причина в том, что в строке `(**)` декоратор вызывает оригинальную функцию как `func(x)`, а в этом случае функция получает `this = undefined`.
114
114
115
115
Мы бы наблюдали похожий симптом, если бы попытались запустить:
116
116
@@ -119,7 +119,7 @@ let func = worker.slow;
119
119
func(2);
120
120
```
121
121
122
-
Т.е. декоратор передает вызов оригинальному методу, но без контекста. Следовательно - ошибка.
122
+
Т.е. декоратор передаёт вызов оригинальному методу, но без контекста. Следовательно -- ошибка.
123
123
124
124
Давайте это исправим.
125
125
@@ -142,7 +142,7 @@ func.call(obj, 1, 2, 3)
142
142
143
143
Они оба вызывают `func` с аргументами `1`, `2` и `3`. Единственное отличие состоит в том, что `func.call` также устанавливает `this` в `obj`.
144
144
145
-
Например, в приведенном ниже коде мы вызываем `sayHi` в контексте различных объектов: `sayHi.call(user)` запускает `sayHi`, передавая `this=user`, а следующая строка устанавливает `this=admin`:
145
+
Например, в приведённом ниже коде мы вызываем `sayHi` в контексте различных объектов: `sayHi.call(user)` запускает `sayHi`, передавая `this=user`, а следующая строка устанавливает `this=admin`:
146
146
147
147
```js run
148
148
functionsayHi() {
@@ -153,11 +153,11 @@ let user = { name: "John" };
153
153
let admin = { name:"Admin" };
154
154
155
155
// используем 'call' для передачи различных объектов как 'this'
156
-
sayHi.call( user ); // this=John
157
-
sayHi.call( admin ); // this=Admin
156
+
sayHi.call( user ); // this = John
157
+
sayHi.call( admin ); // this = Admin
158
158
```
159
159
160
-
Здесь мы используем `call` для вызова `say` с заданным контекстом и аргументом 'phrase':
160
+
Здесь мы используем `call` для вызова `say` с заданным контекстом и фразой:
Чтобы всё было понятно, давайте посмотрим глубже, как передается`this`:
212
+
Чтобы всё было понятно, давайте посмотрим глубже, как передаётся`this`:
213
213
214
214
1. После *декорации*`worker.slow` становится обёрткой `function (x) { ... }`.
215
215
2. Так что при выполнении `worker.slow(2)` обёртка получает `2` в качестве аргумента, и `this=worker` (это объект перед точкой).
216
-
3. Внутри обёртки, если результат еще не кэширован, `func.call(this, x)`передает текущий `this` (`=worker`) и текущий аргумент (`=2`) в оригинальную функцию.
216
+
3. Внутри обёртки, если результат еще не кеширован, `func.call(this, x)`передаёт текущий `this` (`=worker`) и текущий аргумент (`=2`) в оригинальную функцию.
217
217
218
218
## Использование нескольких аргументов с "func.apply"
219
219
@@ -229,7 +229,7 @@ let worker = {
229
229
};
230
230
231
231
// should remember same-argument calls
232
-
worker.slow=cacheingDecorator(worker.slow);
232
+
worker.slow=cachingDecorator(worker.slow);
233
233
```
234
234
235
235
Здесь у нас есть две задачи для решения.
@@ -313,7 +313,7 @@ let wrapper = function() {
313
313
};
314
314
```
315
315
316
-
Это называется *переадресация вызова*. Обертка передает все, что получает: контекст 'this' и аргументы для 'anotherFunction' и возвращает её результат.
316
+
Это называется *переадресация вызова*. Обертка передаёт все, что получает: контекст `this` и аргументы для `anotherFunction` и возвращает её результат.
317
317
318
318
Когда внешний код вызывает такую 'обёртку', он неотличим от вызова исходной функции.
319
319
@@ -412,7 +412,7 @@ hash(1, 2);
412
412
413
413
Этот трюк называется *заимствование метода*.
414
414
415
-
Мы берем (заимствуем) метод join из обычного массива `[].join`. И используем `[].join.call`, чтобы выполнить его в контексте `arguments`.
415
+
Мы берем (заимствуем) метод join из обычного массива `[].join`. И используем `[].join.call`, чтобы выполнить его в контексте `arguments`.
416
416
417
417
Почему это работает?
418
418
@@ -421,8 +421,8 @@ hash(1, 2);
421
421
422
422
1. Пускай первым аргументом будет `glue` или, в случае отсутствия аргументов, им будет запятая `","`
423
423
2. Пускай `result` будет пустой строкой `""`.
424
-
3. Добавить `this[0]` к `result`.
425
-
4. Добавить `this[1]` к `glue`.
424
+
3. Добавить `this[0]` к `result`.
425
+
4. Добавить `this[1]` к `glue`.
426
426
5. Добавить `this[2]` к `glue`.
427
427
6. ...выполнять до тех пор, пока `this.length` элементов не будет склеено.
0 commit comments