Skip to content

Commit 2b1e3ff

Browse files
committed
other.* translation, a final thing
1 parent 812a040 commit 2b1e3ff

File tree

1 file changed

+36
-23
lines changed

1 file changed

+36
-23
lines changed

doc/ru/other/timeouts.md

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
### `setTimeout` и `setInterval`
22

3-
Поскольку JavaScript поддерживает асинхронность, есть возможность запланировать выполнение функции, используя функции `setTimeout` и `setInterval`.
3+
В виду того, что JavaScript умеет совершать асинхронные операции, есть возможность запланировать отложенное выполнение пользовательской функции, используя предназначенные для этого функции `setTimeout` и `setInterval`.
44

5-
> **Замечание:** Таймауты **не** являются частью стандарта ECMAScript, они были разработаны как раздел спецификации[DOM][1].
5+
> **Замечание:** Таймауты **не** являются частью стандарта ECMAScript, они были разработаны будучи частью спецификации[DOM][1].
66
77
function foo() {}
88
var id = setTimeout(foo, 1000); // возвращает число > 0
99

10-
Функция `setTimeout` возвращает идентификатор таймаута и планирует вызвать `foo` через, **примерно**, тысячу миллисекунд. Фунция `foo` при этом будет вызвана ровно **один** раз.
10+
Функция `setTimeout` возвращает идентификатор назначенного таймаута и откладывает вызов `foo` на, **примерно**, тысячу миллисекунд. Фунция `foo`, при этом, будет вызвана только **один** раз.
1111

1212
В зависимости от разрешения таймера в используемом для запуска кода движке JavaScript, а также с учётом того, что JavaScript является однопоточным языком и посторонний код может заблокировать выполнение потока, нет **никакой** гарантии, что переданный код будет выполнен ровно через указанное в вызове `setTimeout` время.
1313

14-
Переданная первым параметром функция будет вызвана как *глобальный объект* — это значит, что оператор [`this`](#function.this) в вызываемой функции будет ссылаться на этот самый объект.
14+
Функция, переданная первым параметром, будет вызвана в контексте *глобального объекта* — это значит, что оператор [`this`](#function.this) в вызываемой функции будет ссылаться на тот самый глобальный объект.
1515

1616
function Foo() {
1717
this.value = 42;
@@ -26,54 +26,67 @@
2626

2727
> **Замечание:** Поскольку `setTimeout` принимает **объект функции** в качестве первого параметра, часто совершается ошибка в использовании `setTimeout(foo(), 1000)`, при котором будет использоваться **возвращённое значение** от вызова функции `foo`, а **не** вызываться сама функция `foo`. В большинстве случаев ошибка пройдёт незамеченной, а в случае если функция возвращает `undefined`, `setTimeout` вообще **не** породит никакой ошибки.
2828
29-
### Поочерёдные вызовы с использованием `setInterval`
29+
### Очереди вызовов с `setInterval`
3030

31-
`setTimeout` вызывает функцию единожды; `setInterval` — как и предполагает название — вызывает функцию **каждые** `X` миллисекунд. И его использование не рекомендуется.
31+
`setTimeout` вызывает функцию единожды; `setInterval` — как и предполагает название — вызывает функцию **каждые** `X` миллисекунд. И использовать его не рекомендуется.
3232

33-
В то время, когда исполняющийся код будет блокироваться во время вызова с таймаутом, `setInterval` будет продолжать планировать последующие вызовы переданной функции. Это может (особенно в случае небольших интервалов) повлечь за собой выстраивание вызовов функций в очередь.
33+
В то время как, если применять `setTimeout`, исполняющийся в данный момент код будет блокировать запланированный — `setInterval` будет продолжать планировать последующие вызовы переданной функции. Это может, особенно при указании небольших интервалов, повлечь за собой выстраивание функций в ожидающую очередь.
3434

3535
function foo(){
36-
// что-то, что выполняется одну секунду
36+
// что-то, выполняющееся одну секунду или более
3737
}
3838
setInterval(foo, 1000);
3939

40-
В приведённом коде `foo` выполнится один раз и заблокирует этим главный поток на одну секунду.
40+
В приведённом примере `foo` в первый же раз заблокирует своим процессом главный поток на одну секунду.
4141

4242
Пока `foo` блокирует код, `setInterval` продолжает планировать последующие её вызовы. Теперь, когда первая `foo` закончила выполнение, в очереди будут уже **десять** ожидающих выполнения вызовов `foo`.
4343

4444
### Разбираемся с потенциальной блокировкой кода
4545

46-
Самый простой и контролируемый способ — использовать `setTimeout` внутри самой функции.
46+
Самый простой и наиболее легко контролируемый способ — использовать `setTimeout` внутри такой функции.
4747

4848
function foo(){
49-
// что-то, выполняющееся одну секунду
49+
// что-то, выполняющееся одну секунду или более
5050
setTimeout(foo, 1000);
5151
}
5252
foo();
5353

5454
Такой способ не только инкапсулирует вызов `setTimeout`, но и предотвращает от очередей блокирующих вызовов и при этом обеспечивает дополнительный контроль. Сама функция `foo` теперь принимает решение, хочет ли она запускаться ещё раз или нет.
5555

56-
### Очистка таймаутов вручную
56+
(''прим. перев.'' — такая техника теперь активно используется при использовании браузерного метода `requestAnimationFrame` для анимации, работающей на `canvas`).
5757

58-
Удаление таймаутов и интервалов работает через передачу соответствуюего идентификатора либо в функцию `clearTimeout`, либо в функцию `clearInterval` — в зависимости от того, какая функция `set...` использовалась для его получения.
58+
### Сброс таймаутов вручную
59+
60+
Удалить таймаут или интервал можно посредством передачи соответствующего идентификатора либо в функцию `clearTimeout`, либо в функцию `clearInterval` — в зависимости от того, какая функция `set...` использовалась для его создания.
5961

6062
var id = setTimeout(foo, 1000);
6163
clearTimeout(id);
6264

63-
### Очистка всех таймаутов
65+
### Сброс всех таймаутов
6466

65-
Из-за того, что встроенного метода для удаления всех таймаутов и/или интервалов не существует, для достижения этой цели приходится использовать брутфорс.
67+
Из-за того, что встроенного метода для удаления всех созданных таймаутов и/или интервалов не существует, для успешного достижения этой цели приходится использовать силу.
6668

67-
// удаляем "все" таймауты
69+
// сбрасываем «все» таймауты
6870
for(var i = 1; i < 1000; i++) {
6971
clearTimeout(i);
7072
}
7173

72-
Вполне могут остаться таймауты, которые не будут захвачены этим произвольным числом; так что всё же рекомендуется следить за идентификаторами всех создающихся таймаутов, засчёт чего их можно будет удалять индивидуально.
74+
Впрочем, с таким кодом, вполне могут остаться «живыми» таймауты, которые не окажутся охвачены настолько произвольным числом.
75+
76+
Есть и другой способ воплотить желаемое — условиться, что значения ID, выдающихся таймаутам, постоянно увеличиваются — с каждым новыми вызовом `setTimeout`.
77+
78+
// сбрасываем «все» таймауты
79+
var biggestTimeoutId = window.setTimeout(function(){}, 1),
80+
i;
81+
for(i = 1; i <= biggestTimeoutId; i++) {
82+
clearTimeout(i);
83+
}
84+
85+
Однако, даже при том, что такой код работает сегодня во всех современных браузерах, нигде не указано и не гарантируется, что значения ID всегда увеличиваются. Поэтому, всё же, рекомендуется следить за *каждым* идентификатором *каждого* создающегося таймаута — это позволит вам надёжно контролировать процесс, сбрасывая их индивидуально.
7386

7487
### Скрытое использование `eval`
7588

76-
`setTimeout` и `setInterval` могут принимать строку в качестве первого параметра. Эту возможность не следует использовать **никогда**, поскольку изнутри при этом производится скрытый вызов `eval`.
89+
`setTimeout` и `setInterval` могут принимать строку в качестве первого параметра. Эту возможность не стоит использовать **никогда**, поскольку изнутри, при этом, производится скрытый вызов `eval`.
7790

7891
> **Замечание**: Поскольку функции работы с таймаутами **не** определены в стандарте ECMAScript, точная внутренняя механика их работы может различаться от движка к движку. Например, Microsoft JScript использует конструктор `Function` вместо `eval`.
7992
@@ -89,9 +102,9 @@
89102
}
90103
bar();
91104

92-
Поскольку `eval` в этом случае не вызывается [напрямую](#core.eval), переданная в `setTimeout` строка будет выполнена в *глобальной области видимости*; так что локальная переменная `foo` из области видимости `bar` не будет выполнена.
105+
Поскольку `eval` в этом случае не вызывается [явно](#core.eval), переданная в `setTimeout` строка будет выполнена в *глобальной области видимости*; так что локальная функция `foo` из области видимости `bar` вообще не будет выполнена.
93106

94-
По этим же причинам рекомендуется **не** использовать строку для передачи аргументов в функцию, которая должна быть вызвана из одной из двух функций, работающих с таймаутами.
107+
По этим же причинам **не рекомендуется** использовать строковое представление вызова функции для передачи аргументов в функцию, которая должна быть вызвана посредством любого из двух известных способов назначения таймаутов.
95108

96109
function foo(a, b, c) {}
97110

@@ -103,13 +116,13 @@
103116
foo(a, b, c);
104117
}, 1000)
105118

106-
> **Замечание:** При том, что синтаксис `setTimeout(foo, 1000, a, b, c)` разрешено использовать, это крайне не рекомендуется, поскольку может привести к сложно-разпознаваемым ошибкам при работе с [методами](#function.this).
119+
> **Замечание:** При том, что практически возможно использовать синтаксис `setTimeout(foo, 1000, a, b, c)`, делать это крайне не рекомендуется, поскольку может привести к трудно-отлавливаемым ошибкам при операциях с [методами](#function.this).
107120
108121
### Заключение
109122

110-
**Никогда** не используйте строки как параметры `setTimeout` или `setInterval`. Это явный признак **действительно** плохого кода. Если вызываемой функции необходимо передавать аргументы, лучше передавать *анонимную функцию*, которая самостоятельно будет отвечать за сам вызов.
123+
**Никогда** не используйте строки как параметры для `setTimeout` или `setInterval`. Это явный признак **действительно** плохого кода. Если вызываемой функции необходимо передавать аргументы, лучше передавать *анонимную функцию*, которая самостоятельно будет отвечать за сам вызов.
111124

112-
Кроме того, избегайте использования `setInterval` в случаях, когда его планировщик может блокировать выполнение JavaScript.
125+
Кроме прочего, избегайте использования `setInterval` в случаях, когда его планировщик может заблокировать выполнение основного кода JavaScript.
113126

114127
[1]: http://ru.wikipedia.org/wiki/Document_Object_Model "Document Object Model"
115128

0 commit comments

Comments
 (0)