Большую часть времени поток выполнения браузера простаивает , код не выполняется.Когда вы регистрируете какую-либо функцию, которая будет выполняться с использованием setTimeout
, она будет выполнена не ранее, чем после заданного количества миллисекунд.
Сейчас: если по истечении заданного промежутка времени исполняется другой код (например, обработчик события илидлинный цикл), рабочий поток браузера занят, и ваша функция должна будет ждать.Рассмотрим этот код:
setTimeout(f, 500);
for(var i = 0; i < 10000000; ++i){
//...
}
setTimeout
возвращает немедленно, что позволяет выполнить цикл.Если этот цикл длится более 500 миллисекунд, он не будет прерван, и вашей функции f
придется подождать.То же самое произойдет, если, например, через 490 миллисекунд вы запустите какой-нибудь длинный обработчик событий.
Рассматривайте рабочий поток JS браузера как очередь с одним потребителем и несколькими производителями.Некоторые элементы в очереди можно сразу же забрать (например, обработчики событий), некоторым придется подождать, пока истечет их время ожидания.