Вопрос проверяет понимание механизма event loop и различий между микро- и макрозадачами в JavaScript, а также умение анализировать последствия блокировки цикла событий.
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.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию