Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: event, loop

Почему setTimeout может выполниться позже указанного времени?

Вопрос проверяет понимание причин задержек таймеров: блокировка потока, приоритеты очередей и ограничения браузера.

Короткий ответ

setTimeout может выполниться позже, потому что после истечения времени callback попадает в очередь задач и ждёт своей очереди. Если основной поток занят синхронным кодом, выполнение откладывается. Также задержку увеличивают microtask, рендер и обработка событий. В фоне браузер может специально замедлять таймеры. Поэтому задержка может стать заметно больше, чем указанное значение.

Длинный ответ

Даже если таймер “истёк”, выполнение callback зависит от того, когда Event Loop сможет реально выполнить задачу.

Основные причины задержек

  1. Блокировка основного потока (call stack занят)

    • длинные циклы

    • тяжёлые вычисления

    • синхронные операции, которые долго выполняются

  2. Очередь microtask имеет приоритет

    • после каждого завершения задачи Event Loop сначала выполняет microtask

    • большое количество Promise.then может “отодвигать” macrotask

  3. Нагрузка: много задач в очереди macrotask

    • множество таймеров

    • обработчики событий

    • другие callbacks, которые накопились

  4. Рендер и работа браузера

    • браузер может вставлять этапы отрисовки

    • тяжёлая разметка/стили/paint могут влиять на задержки

  5. Ограничения браузера (throttling)

    • в неактивных вкладках таймеры часто “тормозятся”

    • экономия батареи и ресурсов

Практический вывод для разработчика

  • таймеры не подходят для точной синхронизации

  • если важна точность, нужно:

    • измерять реальное время через Date.now() / performance.now()

    • учитывать drift и корректировать расписание

Вывод:
setTimeout выполняется позже из-за занятости call stack, приоритета microtask, нагрузки на очередь и ограничений браузера — это нормальное поведение Event Loop.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#event

#loop

Подпишись на React Developer в телеграм