Очень упрощенно:
Браузеры являются однопоточными, и этот однопоточный поток (поток пользовательского интерфейса) используется совместно механизмом рендеринга и механизмом js.
Если то, что вы хотите сделать, занимает много времени (мы говорим здесь циклы, но все же), это может остановить (приостановить) рендеринг (поток и рисование).
В браузерах также существует «корзина», в которой все события сначала помещаются в ожидание, чтобы поток пользовательского интерфейса выполнял то, что он делает. Как только поток завершен, он смотрит в корзину и выбирает задачу первым в строке.
Используя setTimeout
, вы создаете новую задачу в корзине после задержки и позволяете потоку справиться с ней, как только она станет доступной для дальнейшей работы.
История:
После задержки 0 мс создайте новое задание функции
и положить его в ведро. В этот момент поток пользовательского интерфейса занят
делать что-то еще, и есть другие задачи в ведре
уже. Через 6 мс поток становится доступным и получает задачу перед
из твоих, хорошо, ты следующий. Но что? Это была одна огромная вещь! Она имеет
был как раньше (30мс) !!
Наконец-то, теперь тема завершена, приходит и получает
задача.
У большинства браузеров минимальная задержка больше 0, поэтому установка 0 в качестве задержки означает: поместите эту задачу в корзину как можно скорее. Но указание UA положить его в ведро КАК МОЖНО СКОРЕЕ, это не гарантия, что он будет выполнен в тот момент. Ведро похоже на почтовое отделение, может быть, есть длинная очередь других задач. Почтовые отделения также являются однопоточными, и только один человек помогает выполнять все задачи ... извините клиентов за их задачи. Ваша задача должна встать в очередь, как и все остальные.
Если браузер не реализует свой собственный тикер, он использует циклы тиков ОС. Старые браузеры имели минимальные задержки между 10-15 мс. HTML5 указывает , что если задержка меньше 4 мс, UA должен увеличить ее до 4 мс. Говорят, что это согласовано во всех браузерах, выпущенных в 2010 году и далее .
См. Как работают таймеры JavaScript от John Resig для более подробной информации.
Редактировать: Также см. Какого черта цикл событий в любом случае? от Филиппа Робертса из JSConf EU 2014. Это обязательный просмотр для всех, кто касается кода интерфейса.