Ответ вслух Junior Event loop обновлено

Таймеры

Вопрос

Насколько точен setTimeout и чем он отличается от setInterval?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

setTimeout(fn, 100) означает «не раньше чем через 100 мс»: колбэк встанет в очередь макрозадач, а выполнится, когда стек освободится.

Что должно прозвучать в ответе

  • задержка - это минимум, а не гарантия

  • вложенные таймеры после пятого уровня зажимаются до 4 мс

  • в фоновой вкладке таймеры тормозят до секунды и реже

  • setInterval не ждёт завершения колбэка - вызовы накапливаются

  • надёжнее рекурсивный setTimeout с перезапуском в конце работы

  • для анимации - requestAnimationFrame, он синхронизирован с кадром

Что могут спросить следом

  • Как сделать точный таймер обратного отсчёта
  • Почему анимация на setInterval дёргается
  • Что будет с таймером при переходе вкладки в фон

Разбор

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

setInterval ставит вызовы по расписанию независимо от того, успел ли предыдущий: если колбэк медленнее интервала, вызовы накопятся. Безопаснее рекурсивный setTimeout, который планирует следующий запуск после завершения работы.

Для анимации ни то ни другое: requestAnimationFrame привязан к кадру и сам замирает в фоне.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме