Skip to content

Commit ae8cf11

Browse files
committed
fixes
1 parent 787ea6f commit ae8cf11

10 files changed

Lines changed: 28 additions & 28 deletions

File tree

1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/task.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
важность: 5
1+
importance: 5
22

33
---
44

5-
# Декоратор шпион
5+
# Декоратор-шпион
66

7-
Создайте декоратор `spy(func)`, который должен возвращать обёртку, которая сохраняет все вызовы функции в своем свойстве `Call`.
7+
Создайте декоратор `spy(func)`, который должен возвращать обёртку, которая сохраняет все вызовы функции в своем свойстве `calls`.
88

99
Каждый вызов должен сохраняться как массив аргументов.
1010

@@ -27,4 +27,4 @@ for (let args of work.calls) {
2727
}
2828
```
2929

30-
P.S.: Этот декоратор иногда полезен для юнит-тестирования. Его расширенная форма - `sinon.spy` содержится в библиотеке [Sinon.JS] (http://sinonjs.org/).
30+
P.S.: Этот декоратор иногда полезен для юнит-тестирования. Его расширенная форма - `sinon.spy` содержится в библиотеке [Sinon.JS](http://sinonjs.org/).

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ let f1000 = delay(alert, 1000);
1414
f1000("test"); // показывает "test" после 1000 мс
1515
```
1616

17-
Обратите внимание, как здесь используется функция-стрелка. Как мы знаем, функция-стрелока не имеет собственных `this` и `arguments`, поэтому `f.apply(this, arguments)` берет `this` и `arguments` из обёртки.
17+
Обратите внимание, как здесь используется функция-стрелка. Как мы знаем, функция-стрелка не имеет собственных `this` и `arguments`, поэтому `f.apply(this, arguments)` берет `this` и `arguments` из обёртки.
1818

19-
Если мы передадим обычную функцию, `setTimeout` вызовет ее без аргументов и `this = window` (при условии, что код выполняется в браузере).
19+
Если мы передадим обычную функцию, `setTimeout` вызовет ее без аргументов и с `this = window` (при условии, что код выполняется в браузере).
2020

21-
Мы все еще можем передать правильное `this`, используя промежуточную переменную, но это немного громоздко:
21+
Мы все еще можем передать правильный `this`, используя промежуточную переменную, но это немного громоздко:
2222

2323
```js
2424
function delay(f, ms) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
важность: 5
1+
importance: 5
22

33
---
44

@@ -20,6 +20,6 @@ f1000("test"); // показывает "test" после 1000 мс
2020
f1500("test"); // показывает "test" после 1500 мс
2121
```
2222

23-
Другими словами, `delay (f, ms)` возвращает вариант `f` с "задержкой на `ms` мс".
23+
Другими словами, `delay(f, ms)` возвращает вариант `f` с "задержкой на `ms` мс".
2424

2525
В приведенном выше коде `f` - функция с одним аргументом, но ваше решение должно передавать все аргументы и контекст `this`.

1-js/06-advanced-functions/09-call-apply-decorators/03-debounce/_js.view/test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ describe("debounce", function() {
77
this.clock.restore();
88
});
99

10-
it("вызывает функцию максимум один раз в мс", function() {
10+
it("вызывает функцию один раз в 'ms' мс", function() {
1111
let log = '';
1212

1313
function f(a) {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ function debounce(f, ms) {
2020
- `isCooldown = false` -- готова к выполнению.
2121
- `isCooldown = true` -- ожидание окончания тайм-аута.
2222

23-
В первом вызове `isCoolDown` является ложным, поэтому вызов продолжается, и состояние изменяется на `true`.
23+
В первом вызове `isCoolDown = false`, поэтому вызов продолжается, и состояние изменяется на `true`.
2424

25-
Пока `isCoolDown` имеет значение true, все остальные вызовы игнорируются.
25+
Пока `isCoolDown` имеет значение `true`, все остальные вызовы игнорируются.
2626

27-
Затем `setTimeout` устанавливает в него значение `false` после заданной задержки.
27+
Затем `setTimeout` устанавливает его в `false` после заданной задержки.
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
важность: 5
1+
importance: 5
22

33
---
44

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

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

1010
Например:
1111

@@ -15,9 +15,9 @@ let f = debounce(alert, 1000);
1515
f(1); // выполняется немедленно
1616
f(2); // проигнорирован
1717

18-
setTimeout( () => f(3), 100); // проигнорирован ( прошло только 100 мс )
19-
setTimeout( () => f(4), 1100); // выполняется
20-
setTimeout( () => f(5), 1500); // проигнорирован ( прошло только 100 мс от последнего вызова)
18+
setTimeout(() => f(3), 100); // проигнорирован (прошло только 100 мс)
19+
setTimeout(() => f(4), 1100); // выполняется
20+
setTimeout(() => f(5), 1500); // проигнорирован (прошло только 100 мс от последнего вызова)
2121
```
2222

23-
На практике `debounce` полезен для функций, которые извлекают/обновляют что-то и мы знаем, что ничего нового нельзя сделать за такой короткий период времени, поэтому лучше не тратить ресурсы.
23+
На практике `debounce` полезен для функций, которые получают/обновляют данные, и мы знаем, что повторный вызов в течение короткого промежутка времени не даст ничего нового. Так что лучше не тратить на него ресурсы.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function throttle(func, ms) {
2222
setTimeout(function() {
2323
isThrottled = false;
2424
if (savedArgs) {
25-
// если были вызовы, последний savedThis/savedArgs
25+
// если были вызовы, savedThis/savedArgs хранят последний из них
2626
// рекурсивный вызов запускает функцию и снова устанавливает время задержки
2727
wrapper.apply(savedThis, savedArgs);
2828
savedArgs = savedThis = null;

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
@@ -21,7 +21,7 @@ describe("throttle(f, 1000)", function() {
2121
f1000(3); // (задержка - менее 1000 мс с момента последнего вызов)
2222
// запланирован вызов спустя f(3) 1000 мс
2323

24-
assert.equal(log, "1"); // происходит 1-й вызов
24+
assert.equal(log, "1"); // прямо сейчас только 1-й вызов завершен
2525

2626
this.clock.tick(1000); // через 1000 мс...
2727
assert.equal(log, "13"); // log==13, произошел вызов f1000(3)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ function throttle(func, ms) {
3333
Вызов `throttle(func, ms)` возвращает `wrapper`.
3434

3535
1. Во время первого вызова обёртка просто вызывает `func` и устанавливает состояние задержки (`isThrottled = true`).
36-
2. В этом состоянии все вызовы, запоминаются в `saveArgs / saveThis`. Обратите внимание, что контекст и аргументы одинаково важны и должны быть запомнены. Они нам нужны для того, чтобы воспроизвести вызов.
36+
2. В этом состоянии все вызовы запоминаются в `saveArgs / saveThis`. Обратите внимание, что контекст и аргументы одинаково важны и должны быть запомнены. Они нам нужны для того, чтобы воспроизвести вызов позднее.
3737
3. ... Затем по прошествии `ms` миллисекунд срабатывает `setTimeout`. Состояние задержки сбрасывается (`isThrottled = false`). И если мы проигнорировали вызовы, то «обёртка» выполняется с последними запомненными аргументами и контекстом.
3838

3939
На третьем шаге выполняется не `func`, а `wrapper`, потому что нам нужно не только выполнить `func`, но и еще раз установить состояние задержки и таймаут для его сброса.

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
важность: 5
1+
importance: 5
22

33
---
44

5-
# Задерживающий декоратор
5+
# Тормозящий (throttling) декоратор
66

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

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

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

1313
**Например, мы хотим отслеживать движения указателя.**
1414

15-
В браузере мы можем объявить функцию, которая будет запускаться при каждом микродвижении указателя и получать его местоположение при каждом его перемещении. Во время активного использования мыши эта функция запускается очень часто, это может происходить около 100 раз в секунду (каждые 10 мс).
15+
В браузере мы можем объявить функцию, которая будет запускаться при каждом движении указателя и получать его местоположение. Во время активного использования мыши эта функция запускается очень часто, это может происходить около 100 раз в секунду (каждые 10 мс).
1616

1717
**Отслеживающая функция должна обновлять некоторую информацию на веб-странице.**
1818

1919
Функция обновления `update()` слишком ресурсоёмкая, чтобы делать это при каждом микродвижении. Также нет смысла делать это чаще, чем один раз в 100 мс.
2020

21-
Поэтому мы объявим `throttle(update, 100)` как функцию, которая будет запускаться при каждом перемещении указателя вместо оригинальной `update()`. Декоратор будет вызываться часто, но `update()` будет вызываться максимум раз в 100 мс.
21+
Поэтому мы обернем вызов в декоратор: будем использовать throttle(update, 100) как функцию, которая будет запускаться при каждом перемещении указателя вместо оригинальной update(). Декоратор будет вызываться часто, но `update()` будет вызываться максимум раз в 100 мс.
2222

2323
Визуально это будет выглядеть вот так:
2424

0 commit comments

Comments
 (0)