Ответ 1
Очень упрощено:
Браузеры однопоточные, и этот единственный поток (поток пользовательского интерфейса) распределяется между механизмом рендеринга и движком js.
Если вещь, которую вы хотите сделать, занимает много времени (мы говорим о циклах здесь, но все же), она может остановить (paus) рендеринг (поток и краска).
В браузерах также существует "Ведро", где все события сначала задерживаются, когда поток пользовательского интерфейса выполняется с тем, что он делает. Как только поток выполняется, он смотрит в ведро и сначала берет задачу.
Используя setTimeout
, вы создаете новую задачу в корзине после задержки и позволяете потоку справляться с ней, как только она доступна для большей работы.
История:
После задержки 0 мс создать новую задачу функции и положите его в ведро. В этот момент поток пользовательского интерфейса занят делать что-то еще, и есть еще одна задача в ковше уже. После 6ms поток доступен и получает задачу infront твой, хорошо, ты следующий. Но что? Это была одна огромная вещь! В нем есть был как foreeeeeever (30 мс)!
Наконец, теперь поток выполняется с этим и приходит и получает ваш Задача.
Большинство браузеров имеют минимальную задержку, которая больше 0, поэтому установка 0 в качестве задержки означает: Поместите эту задачу в корзину как можно скорее. Но говорить UA, чтобы поместить его в ведро ASAP, не является гарантией того, что он выполнит в тот момент. Ведро похоже на почтовое отделение, может быть, есть еще одна очередь других задач. Почтовые ветки также однопоточные, и только один человек помогает в решении всех задач... извините клиентов за свои задачи. Ваша задача должна попасть в очередь, как и все остальные.
Если браузер не использует собственный тикер, он использует циклы тиков ОС. У старых браузеров были минимальные задержки между 10-15 мс. HTML5 указывает, что если время задержки меньше 4 мс, UA должен увеличить его до 4 мс. Это называется согласованный в браузерах, выпущенных в 2010 году и далее.
Подробнее см. Как работает JavaScript Timers от Джона Ресига.
Изменить: Также см. Какая черта в цикле событий? Филипп Робертс из JSConf EU 2014 Это обязательный просмотр для всех людей, затрагивающих внешний код.