Когда вызывается функция, зарегистрированная с помощью setTimeout? - PullRequest
0 голосов
/ 07 июня 2011

это может быть вызвано после того, как какой-то нормальный код выполняется?но я не уверен ... было бы замечательно, если бы кто-нибудь достаточно нарисовал большую картину того, как код JavaScript выполняется в браузере.

Ответы [ 3 ]

1 голос
/ 07 июня 2011

Большую часть времени поток выполнения браузера простаивает , код не выполняется.Когда вы регистрируете какую-либо функцию, которая будет выполняться с использованием setTimeout, она будет выполнена не ранее, чем после заданного количества миллисекунд.

Сейчас: если по истечении заданного промежутка времени исполняется другой код (например, обработчик события илидлинный цикл), рабочий поток браузера занят, и ваша функция должна будет ждать.Рассмотрим этот код:

setTimeout(f, 500);
for(var i = 0; i < 10000000; ++i){
    //...
}

setTimeout возвращает немедленно, что позволяет выполнить цикл.Если этот цикл длится более 500 миллисекунд, он не будет прерван, и вашей функции f придется подождать.То же самое произойдет, если, например, через 490 миллисекунд вы запустите какой-нибудь длинный обработчик событий.

Рассматривайте рабочий поток JS браузера как очередь с одним потребителем и несколькими производителями.Некоторые элементы в очереди можно сразу же забрать (например, обработчики событий), некоторым придется подождать, пока истечет их время ожидания.

1 голос
/ 07 июня 2011

Javascript является однопоточным и запускается с помощью стека вызовов, который, по сути, является обработкой в ​​порядке очереди.

Функции setInterval и setTimeout помещают переданную функцию в стек вызовов после истечения предоставленной длительности.Различие здесь в том, что результаты не выполняются в это время, они просто помещаются в стек вызовов, поэтому, если что-то уже выполняется, он не выполнит вашу функцию, предоставленную в течение времени ожидания, пока вы не закончите.

Например:

var i = 0;
setTimeout(function() { i = 1; }, 10);
for (; i < 1;) {}

Вы никогда не выйдете из этого цикла for, хотя после 10 мс вызывается функция для установки i в 1, она только в стеке вызовов и выигрывает 'действует до тех пор, пока не завершится цикл for.

0 голосов
/ 07 июня 2011

Может быть, я не понимаю вопроса ... но это взято непосредственно из window спецификации.

setTimeout (функция, миллисекунды) Этот метод вызывает функцию один раз после указанного количества Прошло миллисекунд, пока не отменено при вызове clearTimeout. Методы возвращает идентификатор таймера, который может быть использован в последующий вызов clearTimeout для отменить интервал.

Ссылка

Обычно функция вызывается сразу после того, как прошло указанное вами количество миллисекунд.

...