Почему для первых 4 исполнений вызовы не регулируются?
Полагаю, первый вопрос, который следует задать, это Почему таймер вообще задушен?
Ну, некоторые из них могут быть такими, что такие короткие таймеры запуска
1) сложно реализовать, так как вам нужно либо использовать аппаратный таймер, либо проверить время внутри цикла, чтобы иметь возможность точно планировать время, цикл должен работать очень быстро.
2) потребляет много батареи / вычислительного времени
3), вероятно, вообще не нужны, так как дисплей обновляется примерно каждые 60 кадров в секунду, то есть каждые 16 мс, поэтому, если вы используете таймер, который работает так быстро, вы на самом деле не увидите вывод с этой скоростью.
Тогда следующий вопрос может быть Почему тогда вообще используются такие короткие таймеры?
На самом деле есть несколько веских причин:
1) Отложить действие после
а) текущий кодовый блок, возьмите, например, React's setState
б) DOM rerender
2) Выполнять длительные задачи «асинхронно» в главном потоке, не блокируя пользовательский интерфейс, через некоторое время освобождая его на миллисекунду.
Поэтому в браузере возникает проблема при настройке времени таймера:
Если он ограничивает время, например, setState
на 4 мс, страница может загружаться медленнее в целом. Однако, если он не ограничивает setInterval, который запускается излишне быстро, он расходует батарею пользователя (большинство пользователей в настоящее время пользуются мобильным телефоном).
Поэтому имеет смысл, что браузер очень быстро выполняет несколько таймеров, так что setTimeout(deferred, 0)
запускается сразу, а затем несколько раз дросселирует, чтобы уменьшить негативное влияние неправильно выполненных таймеров рендеринга / алгоритмов длительного запуска.
«4ms» после «5 раз», вероятно, являются сбалансированным результатом этого рассмотрения.