> Как работают call stack, callback queue, event loop, микротаски и макротаски в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: amoCRM, Cyber Interactive, Альфа-банк, Garage Eight, Т-Банк, циан, VK, Kodix, LeverX, Spotware, Домклик, IT-One, Софт Медиа Групп, Rutube, Exness, Сфера, Сбер, TYMY, Evercode, HolyWeb
Стек: JavaScript
> Пример ответа
В JavaScript выполнение кода организовано через call stack (стек вызовов). Это структура данных LIFO, куда попадают функции при их вызове. Когда функция завершается, она удаляется из стека. Если стек переполняется (например, из-за бесконечной рекурсии), возникает ошибка.
Асинхронные операции (setTimeout, fetch, обработчики событий) не попадают сразу в стек. Они передаются в Web API (браузерное окружение) или libuv (Node.js). После завершения их колбэки помещаются в соответствующую очередь.
Макротаски (macrotasks) - это задачи из очереди callback queue: setTimeout, setInterval, I/O, события UI. Event loop на каждой итерации берёт одну макротаску из очереди и выполняет её.
Микротаски (microtasks) - очередь с более высоким приоритетом. Сюда попадают Promise.then/catch/finally, queueMicrotask, MutationObserver. После каждой макротаски event loop опустошает всю очередь микротасок перед тем, как взять следующую макротаску.
Event loop - это бесконечный цикл, который:
-
Проверяет, пуст ли call stack.
-
Если стек пуст, выполняет все микротаски.
-
Затем берёт одну макротаску из очереди и выполняет её.
-
Повторяет.
Пример:
JAVASCRIPTconsole.log('1'); // синхронно, сразу в стекsetTimeout(() => console.log('2'), 0); // макротаскаPromise.resolve().then(() => console.log('3')); // микротаскаconsole.log('4'); // синхронно
Вывод: 1, 4, 3, 2. Сначала синхронный код, затем микротаска (Promise), затем макротаска (setTimeout).
Микротаски блокируют event loop - если они порождают новые микротаски, очередь не опустеет, и макротаски не выполнятся. Это важно учитывать для производительности.
> Похожие задачи по frontend
Как оптимизировать код при отправке запроса на каждый символ ввода
В чем разница между var, const и let в JavaScript
Какие события жизненного цикла HTML-страницы существуют
В чем разница между стрелочной и обычной функцией в контексте this в JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью