Skip to content

Commit 2bcffcb

Browse files
committed
fixes and suggestions
1 parent ae8cf11 commit 2bcffcb

4 files changed

Lines changed: 20 additions & 20 deletions

File tree

1-js/06-advanced-functions/09-call-apply-decorators/02-delay/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ importance: 5
55
# Задерживающий декоратор
66

77
Создайте декоратор `delay(f, ms)`, который задерживает каждый вызов `f` на` ms` миллисекунд.
8-
For instance:
8+
Например:
99

1010
```js
1111
function f(x) {

1-js/06-advanced-functions/09-call-apply-decorators/03-debounce/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ importance: 5
55
# Антидребезговый (debounce) декоратор
66

77
Результатом декоратора `debounce(f, ms)` должна быть обёртка, которая передает вызов `f` не более одного раза в `ms` миллисекунд.
8-
Другими словами, когда мы вызываем `debounce`, это гарантирует, что все остальные вызовы будут игнорироваться в течении `ms`.
8+
Другими словами, когда мы вызываем `debounce`, это гарантирует, что все остальные вызовы будут игнорироваться в течение `ms`.
99

1010
Например:
1111

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/_js.view/test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ describe("throttle(f, 1000)", function() {
1616
assert.equal(log, "1");
1717
});
1818

19-
it("далее вызовы игнорируются до истечения 1000 мс от полседнего вызова", function() {
19+
it("далее вызовы игнорируются до истечения 1000 мс от последнего вызова", function() {
2020
f1000(2); // (задержка - менее 1000 мс с момента последнего вызов)
2121
f1000(3); // (задержка - менее 1000 мс с момента последнего вызов)
2222
// запланирован вызов спустя f(3) 1000 мс

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

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

@@ -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,8 +153,8 @@ 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

160160
Здесь мы используем `call` для вызова `say` с заданным контекстом и аргументом 'phrase':
@@ -204,22 +204,22 @@ function cachingDecorator(func) {
204204
worker.slow = cachingDecorator(worker.slow); // теперь сделаем её кеширующей
205205

206206
alert( worker.slow(2) ); // работает
207-
alert( worker.slow(2) ); // работает, не вызывая первоначальную функцию (кэшируется)
207+
alert( worker.slow(2) ); // работает, не вызывая первоначальную функцию (кешируется)
208208
```
209209

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

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

214214
1. После *декорации* `worker.slow` становится обёрткой `function (x) { ... }`.
215-
2. Так что при выполнении `worker.slow(2)` обёртка получает `2` в качестве аргумента, и `this = worker` (это объект перед точкой).
215+
2. Так что при выполнении `worker.slow(2)` обёртка получает `2` в качестве аргумента, и `this=worker` (это объект перед точкой).
216216
3. Внутри обёртки, если результат еще не кэширован, `func.call(this, x)` передает текущий `this` (`= worker`) и текущий аргумент (`= 2`) в оригинальную функцию.
217217

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

220220
Теперь давайте сделаем `cachingDecorator` еще более универсальным. До сих пор он работал только с функциями с одним аргументом.
221221

222-
Как же кэшировать метод с несколькими аргументами `worker.slow`?
222+
Как же кешировать метод с несколькими аргументами `worker.slow`?
223223

224224
```js
225225
let worker = {
@@ -234,7 +234,7 @@ worker.slow = cacheingDecorator(worker.slow);
234234

235235
Здесь у нас есть две задачи для решения.
236236

237-
Во-первых, - как использовать оба аргумента `min` и `max` для ключа в коллекции `cache`? Ранее для одного аргумента `x` мы могли просто сохранить результат `cache.set (x, result)` и вызвать `cache.get (x)` чтобы получить его. Но теперь нам нужно запомнить результат для *комбинации аргументов* `(min,max)`. Нативный `Map` принимает только одно значение как ключ.
237+
Во-первых, - как использовать оба аргумента `min` и `max` для ключа в коллекции `cache`? Ранее для одного аргумента `x` мы могли просто сохранить результат `cache.set(x, result)` и вызвать `cache.get(x)` чтобы получить его. Но теперь нам нужно запомнить результат для *комбинации аргументов* `(min,max)`. Нативный `Map` принимает только одно значение как ключ.
238238

239239
Есть много возможных решений:
240240

@@ -255,7 +255,7 @@ worker.slow = cacheingDecorator(worker.slow);
255255
func.apply(context, args)
256256
```
257257

258-
Он выполняет `func`, устанавливая`this = context`, и использует массивоподобный объект `args` в качестве списка аргументов.
258+
Он выполняет `func`, устанавливая`this=context`, и использует массивоподобный объект `args` в качестве списка аргументов.
259259

260260
Например, эти два вызова почти одинаковые:
261261

@@ -264,9 +264,9 @@ func(1, 2, 3);
264264
func.apply(context, [1, 2, 3])
265265
```
266266

267-
Оба запускают `func`, передавая аргументы `1,2,3`. Но `apply` также устанавливает `this = context`.
267+
Оба запускают `func`, передавая аргументы `1,2,3`. Но `apply` также устанавливает `this=context`.
268268

269-
Например, здесь `say` вызывается с `this = user` и `messageData` в качестве списка аргументов:
269+
Например, здесь `say` вызывается с `this=user` и `messageData` в качестве списка аргументов:
270270

271271
```js run
272272
function say(time, phrase) {
@@ -279,7 +279,7 @@ let messageData = ['10:00', 'Hello']; // становится time и phrase
279279

280280
*!*
281281
// this принимает значение user, messageData передаётся как список аргументов (time, phrase)
282-
say.apply(user, messageData); // [10:00] John: Hello (this = user)
282+
say.apply(user, messageData); // [10:00] John: Hello (this=user)
283283
*/!*
284284
```
285285

@@ -301,7 +301,7 @@ func.apply(context, args); // тот же эффект
301301
- Оператор расширения `...` позволяет передавать *итеративный* объект `args` в виде списка в `call`.
302302
- В свою очередь `Apply` принимает только *массивоподобный* объект `args`.
303303

304-
Итак, эти вызовы дополняют друг друга. Там, где мы ожидаем итеративность, работает `call`, где мы ожидаем массивоподобный объект, работает` apply`.
304+
Итак, эти вызовы дополняют друг друга. Там, где мы ожидаем итеративность, работает `call`, где мы ожидаем массивоподобный объект, работает `apply`.
305305

306306
И если `args` является итеративным и похожим на реальный массив, то технически мы могли бы использовать любой из них, но `apply`, вероятно, будет быстрее, потому что это одна операция. Большинство движков JavaScript внутренне оптимизируют его лучше, чем пара `call + spread`.
307307

@@ -360,7 +360,7 @@ alert( "Again " + worker.slow(3, 5) ); // аналогично (из кеша)
360360

361361
Есть два изменения:
362362

363-
- В строке `(*)` вызываем `hash` для создания одного ключа из `arguments`. Здесь мы используем простую функцию "объединения", которая превращает аргументы `(3, 5)` в ключ `" 3,5 "`. В более сложных случаях могут потребоваться другие функции хеширования
363+
- В строке `(*)` вызываем `hash` для создания одного ключа из `arguments`. Здесь мы используем простую функцию "объединения", которая превращает аргументы `(3, 5)` в ключ `" 3,5 "`. В более сложных случаях могут потребоваться другие функции хеширования.
364364
- Затем `(**)` используем `func.apply` для передачи как контекста, так и всех аргументов, полученных обёрткой (независимо от их количества), в исходную функцию.
365365

366366

@@ -427,9 +427,9 @@ hash(1, 2);
427427
6. ...выполнять до тех пор, пока `this.length` элементов не будет склеено.
428428
7. Вернуть `result`.
429429

430-
Таким образом, технически он принимает `this` и объединяет `this[0]`, `this[1]`... и т.д. вместе. Он намеренно написан так, что допускает любое подобное массиву `this` (не случайно, многие методы следуют этой практике). Вот почему он также работает с `this = arguments`.
430+
Таким образом, технически он принимает `this` и объединяет `this[0]`, `this[1]`... и т.д. вместе. Он намеренно написан так, что допускает любое подобное массиву `this` (не случайно, многие методы следуют этой практике). Вот почему он также работает с `this=arguments`.
431431

432-
## Резюме
432+
## Итого
433433

434434
*Декоратор* - это обертка вокруг функции, которая изменяет поведение последней. Основная работа по-прежнему выполняется функцией.
435435

@@ -450,7 +450,7 @@ let wrapper = function(original, arguments) {
450450
}
451451
```
452452

453-
Мы также рассмотрели пример *заимствования метода*, когда мы вызываем метод у объекта в контексте другого объекта. Весьма распространено заимствовать методы массива и применять их к аргументам. Альтернативным способом является использование объекта рест-параметров `...args`, который является реальным массивом.
453+
Мы также рассмотрели пример *заимствования метода*, когда мы вызываем метод у объекта в контексте другого объекта. Весьма распространено заимствовать методы массива и применять их к аргументам. В качестве альтернативы можно использовать объект с остаточными параметрами `...args`, который является реальным массивом.
454454

455455

456456
В реальной практике очень много декораторов. Проверьте, насколько хорошо вы их освоили, решая задачи этой главы.

0 commit comments

Comments
 (0)