Проверяет понимание проблемы вложенных setTimeout с нулевой задержкой и её влияния на производительность.
Когда вы вызываете setTimeout с нулевым таймаутом, браузер не выполняет функцию мгновенно, а ставит её в очередь задач. Если таких вызовов много, они накапливаются, и каждая следующая задача ждёт завершения предыдущей. Это приводит к тому, что основной поток занят обработкой этих задач, и другие события (клики, анимации, ввод) задерживаются.
// Плохой пример: 1000 вложенных setTimeout
function loop(i) {
if (i > 1000) return;
setTimeout(() => {
console.log(i);
loop(i + 1);
}, 0);
}
loop(0); // Блокирует интерфейс на несколько секундВ этом примере каждая итерация создаёт новую задачу, и браузер не может обработать другие события, пока все 1000 задач не выполнятся. Это особенно заметно на слабых устройствах.
Event loop обрабатывает задачи из очереди по одной. Если очередь постоянно пополняется новыми задачами, другие типы задач (например, рендеринг) не получают шанса выполниться. Браузеры обычно ограничивают вложенные setTimeout до 4 мс после пятого уровня, но это не решает проблему полностью.
Вместо setTimeout с нулевой задержкой используйте requestAnimationFrame для анимаций или разбивайте тяжёлые вычисления на части с помощью setTimeout, но с задержкой больше нуля. Также можно использовать Web Workers для фоновых задач.
Избегайте массового использования setTimeout с нулевым таймаутом для рекурсивных операций. Применяйте более эффективные методы планирования, чтобы не блокировать основной поток и сохранять отзывчивость интерфейса.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию