Где хранится таймер?
Асинхронность и Event Loop
Таймер (`setTimeout`/`setInterval`) хранится не в JavaScript-движке, а в Web API браузера (или в системе таймеров Node.js); движок лишь получает id и коллбэк.
Где «живёт» таймер
Когда вызывается setTimeout, коллбэк и время отсчёта передаются в Web API браузера (вне JS-движка). Движок не ждёт таймер — он продолжает выполнять код:
const id = setTimeout(callback, 1000);
// callback хранится в Web API, движок продолжает работуКак это работает
setTimeoutрегистрирует таймер в Web API, возвращает id.- Web API отсчитывает время вне JS-потока.
- По истечении времени коллбэк попадает в очередь макрозадач.
- 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).