PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Где хранится таймер?

Асинхронность и Event Loop

Таймер (`setTimeout`/`setInterval`) хранится не в JavaScript-движке, а в Web API браузера (или в системе таймеров Node.js); движок лишь получает id и коллбэк.

Где «живёт» таймер

Когда вызывается setTimeout, коллбэк и время отсчёта передаются в Web API браузера (вне JS-движка). Движок не ждёт таймер — он продолжает выполнять код:

const id = setTimeout(callback, 1000);
// callback хранится в Web API, движок продолжает работу

Как это работает

  1. setTimeout регистрирует таймер в Web API, возвращает id.
  2. Web API отсчитывает время вне JS-потока.
  3. По истечении времени коллбэк попадает в очередь макрозадач.
  4. Event Loop берёт его, когда call stack пуст.
setTimeout → Web API (таймер) → по истечении → очередь макрозадач → Event Loop → стек

Идентификатор таймера

setTimeout/setInterval возвращают числовой id, по которому таймер отменяют:

const id = setTimeout(fn, 1000);
clearTimeout(id); // отмена

id — ссылка на таймер в реестре Web API.

В Node.js

Таймеры управляются libuv (системный слой), а не движком V8; принцип тот же — коллбэк в очередь по истечении.

Коротко для собеседования

Таймер хранится в Web API браузера (в Node — libuv), а не в JS-движке: движок регистрирует коллбэк и получает id, продолжая работу. Web API отсчитывает время вне потока, по истечении кладёт коллбэк в очередь макрозадач, откуда Event Loop берёт его при пустом стеке. Отменяют по id (clearTimeout).

Другие вопросы раздела