Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Что произойдёт с браузером при бесконечном добавлении микрозадач? Почему это опаснее, чем бесконечные макрозадачи?

Вопрос проверяет понимание механизма event loop и различий между микро- и макрозадачами в JavaScript, а также умение анализировать последствия блокировки цикла событий.

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

При бесконечном добавлении микрозадач браузер зависнет, так как event loop будет обрабатывать их бесконечно, не переходя к макрозадачам, включая рендеринг. Это опаснее, чем бесконечные макрозадачи, потому что макрозадачи выполняются по одной за цикл, позволяя браузеру обновлять интерфейс между ними. Микрозадачи же обрабатываются до исчерпания очереди, блокируя рендеринг и взаимодействие с пользователем.

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

Как работает event loop

Event loop в JavaScript управляет выполнением кода, обрабатывая очереди макрозадач (например, setTimeout, события) и микрозадач (например, Promise.then, MutationObserver). После каждой макрозадачи event loop проверяет очередь микрозадач и выполняет все до ее опустошения, прежде чем перейти к следующей макрозадаче или рендерингу.

Бесконечные микрозадачи

Если микрозадача постоянно добавляет новую микрозадачу (например, через рекурсивный Promise.resolve().then()), очередь микрозадач никогда не опустеет. Event loop застрянет в цикле обработки микрозадач, не переходя к макрозадачам, включая рендеринг и обработку пользовательского ввода. Браузер зависнет, страница перестанет отвечать.

function infiniteMicrotasks() {
  Promise.resolve().then(infiniteMicrotasks);
}
infiniteMicrotasks();
// Браузер зависнет

Бесконечные макрозадачи

Если макрозадача добавляет новую макрозадачу (например, через setTimeout), каждая выполняется отдельно, и между ними event loop может обработать другие макрозадачи, включая рендеринг. Хотя страница может тормозить, она не зависнет полностью, так как браузер успевает обновлять интерфейс.

function infiniteMacrotasks() {
  setTimeout(infiniteMacrotasks, 0);
}
infiniteMacrotasks();
// Страница тормозит, но не зависает

Вывод

Бесконечные микрозадачи опаснее, так как блокируют event loop на уровне, не позволяя браузеру выполнять рендеринг и реагировать на действия пользователя. Это может привести к полной потере отзывчивости интерфейса. Важно избегать рекурсивных микрозадач без условий выхода, особенно в асинхронном коде, где используются Promise или async/await.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

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

#event loop

#microtask

#macrotask

#JavaScript

#concurrency

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию