renovations

This commit is contained in:
Ilya Kantor 2015-01-14 10:23:45 +03:00
parent c7d4c7e3ff
commit e1948130f6
170 changed files with 1496 additions and 1161 deletions

View file

@ -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 раз по окончании работы функции. Такое поведение кросс-браузерно.

View file

@ -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();
```