37 lines
No EOL
1.9 KiB
Markdown
37 lines
No EOL
1.9 KiB
Markdown
Вызов `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 раз по окончании работы функции. Такое поведение кросс-браузерно. |