en.javascript.info/1-js/7-js-misc/3-setTimeout-setInterval/5-setinterval-result/solution.md
2015-03-10 12:36:58 +03:00

37 lines
No EOL
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Вызов `alert(i)` в `setTimeout` введет `100000001`.
Можете проверить это запуском:
```js
//+ run
var timer = setInterval(function() {
i++;
}, 10);
setTimeout(function() {
clearInterval(timer);
*!*
alert( i ); // (*)
*/!*
}, 50);
var i;
function f() {
// точное время выполнения не играет роли
// здесь оно заведомо больше 100мс
for (i = 0; i < 1e8; i++) f[i % 2] = i;
}
f();
```
Правильный вариант срабатывания: **3** (сразу же по окончании `f` один раз).
Планирование `setInterval` будет вызывать функцию каждые `10мс` после текущего времени. Но так как интерпретатор занят долгой функцией, то до конца ее работы никакого вызова не происходит.
За время выполнения `f` может пройти время, на которое запланированы несколько вызовов `setInterval`, но в этом случае остается только один, т.е. накопления вызовов не происходит. Такова логика работы `setInterval`.
После окончания текущего скрипта интерпретатор обращается к очереди запланированных вызовов, видит в ней `setInterval` и выполняет. А затем тут же выполняется `setTimeout`, очередь которого тут же подошла.
Итого, как раз и видим, что `setInterval` выполнился ровно 1 раз по окончании работы функции. Такое поведение кросс-браузерно.