Skip to content

Commit 340e161

Browse files
committed
fixes
1 parent b9984d9 commit 340e161

4 files changed

Lines changed: 20 additions & 20 deletions

File tree

1-js/06-advanced-functions/06-function-object/5-sum-many-brackets/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ sum(6)(-1)(-2)(-3) == 0
1414
sum(0)(1)(2)(3)(4)(5) == 15
1515
```
1616

17-
P.S. Hint: you may need to setup custom object to primitive conversion for your function.
17+
P.S. Hint: you may need to setup custom object to primitive conversion for your function.

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ importance: 5
22

33
---
44

5-
# Антидребезговый (debounce) декоратор
5+
# Декоратор debounce
66

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

1010
Например:

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ importance: 5
66

77
Создайте "тормозящий" декоратор `throttle(f, ms)` - который возвращает обёртку, передавая вызов в `f` не более одного раза в `ms` миллисекунд. Те вызовы, которые попадают в период "торможения", игнорируются.
88

9-
**Вариант с `debounce` - если проигнорированный вызов является последним во время "задержки", то он выполняется в конце.**
9+
**Отличие от `debounce` - если проигнорированный вызов является последним во время "задержки", то он выполняется в конце.**
1010

1111
Давайте рассмотрим реальное приложение, чтобы лучше понять это требование и выяснить, откуда оно взято.
1212

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ alert( "Again: " + slow(2) ); // возвращаем кеш
6464
- При необходимости мы можем объединить несколько декораторов (речь о них пойдет позже).
6565

6666

67-
## Применение "func.call" к контексту.
67+
## Применение "func.call" для передачи контекста.
6868

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

@@ -212,10 +212,10 @@ alert( worker.slow(2) ); // работает, не вызывая первона
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

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

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

@@ -224,7 +224,7 @@ alert( worker.slow(2) ); // работает, не вызывая первона
224224
```js
225225
let worker = {
226226
slow(min, max) {
227-
return min + max; // страшно тяжелая задача для процессора
227+
return min + max; // здесь может быть тяжёлая задача
228228
}
229229
};
230230

@@ -234,11 +234,11 @@ worker.slow = cachingDecorator(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

241-
1. Реализовать новую (или использовать стороннюю) структуру данных типа коллекции, которая которая более универсальна и поддерживает множественные ключи.
241+
1. Реализовать новую (или использовать стороннюю) структуру данных для коллекции, которая которая более универсальна чем встроенный `Map`, и поддерживает множественные ключи.
242242
2. Использовать вложенные коллекции: `cache.set(min)` будет `Map` которая хранит пару `(max, result)`. Тогда получить `result` мы можем вызвав `cache.get(min).get(max)`.
243243
3. Соединить два значения в одно. В нашем конкретном случае мы можем просто использовать строку `"min,max"` как ключ к `Map`. Для гибкости, мы можем позволить передавать *функцию кеширования* в декоратор, которая знает, как сделать одно значение из многих.
244244

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

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

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

@@ -283,8 +283,8 @@ say.apply(user, messageData); // [10:00] John: Hello (this=user)
283283
*/!*
284284
```
285285

286-
Единственная разница в синтаксисе между `call` и `apply` состоит в том, что `call` ожидает список аргументов, в то время как `apply` принимает массивоподобный объект.
287-
Мы уже знаем оператор расширения `...` из главы <info: rest-parameters-spread-operator>, который может передавать массив (или любой итеративный объект) в виде списка аргументов. Поэтому, если мы используем его с `call`, мы можем достичь почти того же, что и `apply`.
286+
Единственная разница в синтаксисе между `call` и `apply` состоит в том, что `call` ожидает список аргументов, в то время как `apply` принимает объект-псевдомассив.
287+
Мы уже знаем оператор расширения `...` из главы <info: rest-parameters-spread-operator>, который может передавать массив (или любой перебираемый объект) в виде списка аргументов. Поэтому, если мы используем его с `call`, мы можем достичь почти того же, что и `apply`.
288288
Эти два вызова почти эквивалентны:
289289

290290
```js
@@ -298,12 +298,12 @@ func.apply(context, args); // тот же эффект
298298

299299
Если мы посмотрим более внимательно, то между такими использованиями `call` и` apply` есть небольшая разница.
300300

301-
- Оператор расширения `...` позволяет передавать *итеративный* объект `args` в виде списка в `call`.
302-
- В свою очередь `Apply` принимает только *массивоподобный* объект `args`.
301+
- Оператор расширения `...` позволяет передавать *перебираемый* объект `args` в виде списка в `call`.
302+
- В свою очередь `Apply` принимает только *объект-псевдомассив* `args`.
303303

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

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

308308
Одним из наиболее важных применений `apply` является передача вызова другой функции, например так:
309309

@@ -384,7 +384,7 @@ function hash(args) {
384384
}
385385
```
386386

387-
...К сожалению, это не сработает. Потому что мы вызываем `hash(arguments)`а объект `arguments` является итеративным и массивоподобным, но не реальным массивом.
387+
...К сожалению, это не сработает. Потому что мы вызываем `hash(arguments)`а объект `arguments` является перебираемым и объектом-псевдомассивом, но не реальным массивом.
388388

389389
Таким образом, вызов `join` для него потерпит неудачу, что мы и можем видеть ниже:
390390

@@ -416,7 +416,7 @@ hash(1, 2);
416416

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

419-
Это связано с тем, что внутренний алгоритм нативного метода arr.join(glue) очень прост.
419+
Это связано с тем, что внутренний алгоритм встроенного метода arr.join(glue) очень прост.
420420
Взято из спецификации практически "как есть":
421421

422422
1. Пускай первым аргументом будет `glue` или, в случае отсутствия аргументов, им будет запятая `","`
@@ -440,7 +440,7 @@ hash(1, 2);
440440
Для реализации `cachingDecorator` мы изучили методы:
441441

442442
- [func.call(context, arg1, arg2...)](mdn:js/Function/call) -- вызывает `func` с данным контекстом и аргументами.
443-
- [func.apply(context, args)](mdn:js/Function/apply) -- вызывает `func` передавая `context` как `this` и массивоподобный `args` как список аргументов.
443+
- [func.apply(context, args)](mdn:js/Function/apply) -- вызывает `func` передавая `context` как `this` и объект-псевдомассив `args` как список аргументов.
444444

445445
В основном *переадресация вызова* выполняется с помощью `apply`:
446446

0 commit comments

Comments
 (0)