Что такое Event Loop?
Асинхронность и Event Loop
Event Loop (цикл событий) — это механизм, который позволяет однопоточному JavaScript выполнять асинхронный код: он следит за стеком вызовов и очередями задач и решает, что выполнять следующим.
Из чего состоит модель
- Call Stack — стек, где выполняется синхронный код прямо сейчас.
- Web API / C++ API — таймеры, сеть, DOM-события живут вне движка (в браузере или Node.js).
- Macrotask queue — очередь макрозадач:
setTimeout,setInterval, обработчики событий, I/O. - Microtask queue — очередь микрозадач: коллбэки
Promise.then/catch/finally,queueMicrotask,MutationObserver.
Алгоритм работы
- Полностью выполняется синхронный код в стеке.
- Когда стек пуст — выполняются все микрозадачи подряд (включая те, что появились по ходу).
- Затем берётся одна макрозадача, выполняется, и снова опустошается вся очередь микрозадач.
- Между этими шагами браузер при необходимости делает рендеринг.
Классический пример
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// Порядок: 1, 4, 3, 23 печатается раньше 2, потому что микрозадачи (Promise) обрабатываются раньше макрозадач (setTimeout), даже с задержкой 0.
Нюансы
- Тяжёлая синхронная задача блокирует цикл: рендер и события «замерзают».
- Бесконечная генерация микрозадач может «заморозить» страницу, не давая дойти до макрозадач и рендера.
Коротко для собеседования
Event Loop — цикл, который при пустом стеке сначала выполняет все микрозадачи (Promise), потом одну макрозадачу (setTimeout), и так по кругу. Это даёт асинхронность в одном потоке.
Подробнее: learn.javascript.ru — Event Loop, MDN — Event loop