Skip to content

Commit 26f4c6d

Browse files
committed
corrections article
1 parent 7a257b9 commit 26f4c6d

1 file changed

Lines changed: 18 additions & 18 deletions

File tree

  • 1-js/06-advanced-functions/09-call-apply-decorators

1-js/06-advanced-functions/09-call-apply-decorators/article.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ alert( slow(2) ); // slow(2) кешируем
4343
alert( "Again: " + slow(2) ); // возвращаем кеш
4444
```
4545

46-
В коде выше `cachingDecorator` - *декоратор*: это специальная функция, которая принимает другую функцию и изменяет ее поведение.
46+
В коде выше `cachingDecorator` -- это *декоратор*, специальная функция, которая принимает другую функцию и изменяет её поведение.
4747

48-
Идея состоит в том, что мы можем вызвать `cachingDecorator` с любой функцией, в результате чего мы получим кеширующую обертку. Это здорово, т.к. у нас может быть множество функций, использующих такой функционал, и все, что нам нужно сделать - это применить к ним `cachingDecorator`.
48+
Идея состоит в том, что мы можем вызвать `cachingDecorator` с любой функцией, в результате чего мы получим кеширующую обёртку. Это здорово, т.к. у нас может быть множество функций, использующих такой функционал, и все, что нам нужно сделать - это применить к ним `cachingDecorator`.
4949

5050
Отделяя кеширующий код от основного кода, мы также сохраняем чистоту и простоту последнего.
5151

@@ -55,7 +55,7 @@ alert( "Again: " + slow(2) ); // возвращаем кеш
5555

5656
![](decorator-makecaching-wrapper.png)
5757

58-
Как мы видим обертка возвращает результат выполнения `func(x)` "как есть". Из внешнего кода обернутая функция `slow` по-прежнему делает то же самое. Обертка всего добавляет к её поведению аспект кэширования.
58+
Как мы видим обертка возвращает результат выполнения `func(x)` "как есть". Из внешнего кода обернутая функция `slow` по-прежнему делает то же самое. Обертка всего добавляет к её поведению аспект кеширования.
5959

6060
Подводя итог, можно выделить несколько преимуществ использования отдельной `cachingDecorator` вместо изменения кода самой `slow`:
6161

@@ -68,7 +68,7 @@ alert( "Again: " + slow(2) ); // возвращаем кеш
6868

6969
Упомянутый выше кеширующий декоратор не подходит для работы с методами объектов.
7070

71-
Например, в приведенном ниже коде `worker.slow()` перестает работать после применения декоратора:
71+
Например, в приведённом ниже коде `worker.slow()` перестает работать после применения декоратора:
7272

7373
```js run
7474
// зделаем worker.slow кеширующим
@@ -110,7 +110,7 @@ alert( worker.slow(2) ); // Ой! Ошибка: не удается прочит
110110

111111
Ошибка возникает в строке `(*)`. Функция пытается получить доступ к `this.someMethod` и завершается с ошибкой. Видите почему?
112112

113-
Причина в том, что в строке `(**)` декоратор вызывает оригинальную функцию как `func(x)`, а в этом случае функция получает `this=undefined`.
113+
Причина в том, что в строке `(**)` декоратор вызывает оригинальную функцию как `func(x)`, а в этом случае функция получает `this = undefined`.
114114

115115
Мы бы наблюдали похожий симптом, если бы попытались запустить:
116116

@@ -119,7 +119,7 @@ let func = worker.slow;
119119
func(2);
120120
```
121121

122-
Т.е. декоратор передает вызов оригинальному методу, но без контекста. Следовательно - ошибка.
122+
Т.е. декоратор передаёт вызов оригинальному методу, но без контекста. Следовательно -- ошибка.
123123

124124
Давайте это исправим.
125125

@@ -142,7 +142,7 @@ func.call(obj, 1, 2, 3)
142142

143143
Они оба вызывают `func` с аргументами `1`, `2` и `3`. Единственное отличие состоит в том, что `func.call` также устанавливает `this` в `obj`.
144144

145-
Например, в приведенном ниже коде мы вызываем `sayHi` в контексте различных объектов: `sayHi.call(user)` запускает `sayHi`, передавая `this=user`, а следующая строка устанавливает `this=admin`:
145+
Например, в приведённом ниже коде мы вызываем `sayHi` в контексте различных объектов: `sayHi.call(user)` запускает `sayHi`, передавая `this=user`, а следующая строка устанавливает `this=admin`:
146146

147147
```js run
148148
function sayHi() {
@@ -153,11 +153,11 @@ let user = { name: "John" };
153153
let admin = { name: "Admin" };
154154

155155
// используем '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
158158
```
159159

160-
Здесь мы используем `call` для вызова `say` с заданным контекстом и аргументом 'phrase':
160+
Здесь мы используем `call` для вызова `say` с заданным контекстом и фразой:
161161

162162

163163
```js run
@@ -172,7 +172,7 @@ say.call( user, "Hello" ); // John: Hello
172172
```
173173

174174

175-
В нашем случае мы можем использовать `call` в обертке для передачи контекста в исходную функцию:
175+
В нашем случае мы можем использовать `call` в обёртке для передачи контекста в исходную функцию:
176176

177177

178178
```js run
@@ -209,11 +209,11 @@ alert( worker.slow(2) ); // работает, не вызывая первона
209209

210210
Теперь всё в порядке.
211211

212-
Чтобы всё было понятно, давайте посмотрим глубже, как передается `this`:
212+
Чтобы всё было понятно, давайте посмотрим глубже, как передаётся `this`:
213213

214214
1. После *декорации* `worker.slow` становится обёрткой `function (x) { ... }`.
215215
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`) в оригинальную функцию.
217217

218218
## Использование нескольких аргументов с "func.apply"
219219

@@ -229,7 +229,7 @@ let worker = {
229229
};
230230

231231
// should remember same-argument calls
232-
worker.slow = cacheingDecorator(worker.slow);
232+
worker.slow = cachingDecorator(worker.slow);
233233
```
234234

235235
Здесь у нас есть две задачи для решения.
@@ -313,7 +313,7 @@ let wrapper = function() {
313313
};
314314
```
315315

316-
Это называется *переадресация вызова*. Обертка передает все, что получает: контекст 'this' и аргументы для 'anotherFunction' и возвращает её результат.
316+
Это называется *переадресация вызова*. Обертка передаёт все, что получает: контекст `this` и аргументы для `anotherFunction` и возвращает её результат.
317317

318318
Когда внешний код вызывает такую 'обёртку', он неотличим от вызова исходной функции.
319319

@@ -412,7 +412,7 @@ hash(1, 2);
412412

413413
Этот трюк называется *заимствование метода*.
414414

415-
Мы берем (заимствуем) метод join из обычного массива `[] .join`. И используем `[] .join.call`, чтобы выполнить его в контексте `arguments`.
415+
Мы берем (заимствуем) метод join из обычного массива `[].join`. И используем `[].join.call`, чтобы выполнить его в контексте `arguments`.
416416

417417
Почему это работает?
418418

@@ -421,8 +421,8 @@ hash(1, 2);
421421

422422
1. Пускай первым аргументом будет `glue` или, в случае отсутствия аргументов, им будет запятая `","`
423423
2. Пускай `result` будет пустой строкой `""`.
424-
3. Добавить `this [0]` к `result`.
425-
4. Добавить `this [1]` к `glue`.
424+
3. Добавить `this[0]` к `result`.
425+
4. Добавить `this[1]` к `glue`.
426426
5. Добавить `this[2]` к `glue`.
427427
6. ...выполнять до тех пор, пока `this.length` элементов не будет склеено.
428428
7. Вернуть `result`.

0 commit comments

Comments
 (0)