renovations
This commit is contained in:
parent
c7d4c7e3ff
commit
e1948130f6
170 changed files with 1496 additions and 1161 deletions
|
@ -0,0 +1,37 @@
|
|||
Вызов `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 раз по окончании работы функции. Такое поведение кросс-браузерно.
|
|
@ -0,0 +1,44 @@
|
|||
# Что выведет после setInterval?
|
||||
|
||||
[importance 5]
|
||||
|
||||
В коде ниже запускается `setInterval` каждые 10мс, и через 50мс запланирована его отмена.
|
||||
|
||||
После этого запущена тяжёлая функция `f`, выполнение которой (мы точно знаем) потребует более 100мс.
|
||||
|
||||
Сработает ли `setInterval`, как и когда?
|
||||
|
||||
Варианты:
|
||||
<ol>
|
||||
<li>Да, несколько раз, *в процессе* выполнения `f`.</li>
|
||||
<li>Да, несколько раз, *сразу после* выполнения `f`.</li>
|
||||
<li>Да, один раз, *сразу после* выполнения `f`.</li>
|
||||
<li>Нет, не сработает.</li>
|
||||
<li>Может быть по-разному, как повезёт.</li>
|
||||
</ol>
|
||||
|
||||
Что выведет `alert` в строке `(*)`?
|
||||
|
||||
```js
|
||||
var i;
|
||||
var timer = setInterval(function() { // планируем setInterval каждые 10мс
|
||||
i++;
|
||||
}, 10);
|
||||
|
||||
setTimeout(function() { // через 50мс - отмена setInterval
|
||||
clearInterval(timer);
|
||||
*!*
|
||||
alert(i); // (*)
|
||||
*/!*
|
||||
}, 50);
|
||||
|
||||
// и запускаем тяжёлую функцию
|
||||
function f() {
|
||||
// точное время выполнения не играет роли
|
||||
// здесь оно заведомо больше 100мс
|
||||
for(i=0; i<1e8; i++) f[i%2] = i;
|
||||
}
|
||||
|
||||
f();
|
||||
```
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue