Проверяет понимание однопоточной модели JavaScript и влияния блокирующих операций на интерактивность страницы.
JavaScript в браузере работает в одном главном потоке. Это означает, что все задачи — обработка событий, рендеринг, выполнение кода — выполняются последовательно. Когда выполняется какой-либо код, браузер не может одновременно обрабатывать другие события. Если код выполняется бесконечно, главный поток никогда не освобождается, и страница перестает реагировать на действия пользователя.
Бесконечная рекурсия — это функция, которая вызывает саму себя без условия выхода. Каждый вызов добавляет новый кадр в стек вызовов. Поскольку стек имеет ограниченный размер, рано или поздно произойдет переполнение стека (stack overflow). Однако до этого момента выполнение кода будет полностью блокировать поток. Браузер не сможет обновить интерфейс, обработать клики или даже показать анимацию.
function infiniteRecursion() {
console.log('Бесконечный вызов');
infiniteRecursion(); // нет условия выхода
}
infiniteRecursion(); // блокирует главный потокКогда вы запускаете такой код, браузер перестает отвечать. Если подождать несколько секунд, браузер может показать диалог «Скрипт не отвечает» и предложить остановить его. Это защитный механизм, который позволяет пользователю прервать зависший скрипт. До этого момента страница полностью неинтерактивна: нельзя кликать, скроллить, вводить текст.
Для длительных операций следует использовать асинхронные подходы: setTimeout, requestAnimationFrame, Web Workers или разбиение задачи на части. Например, рекурсию можно переписать с использованием хвостовой рекурсии, но в JavaScript это не оптимизируется автоматически. Лучше использовать итеративный цикл с проверкой условия или передавать управление обратно в event loop через setTimeout.
function processLargeTask() {
let i = 0;
function step() {
while (i < 1000000) {
// тяжелая работа
i++;
}
if (i < 1000000) {
setTimeout(step, 0); // даем браузеру обработать события
}
}
step();
}Бесконечная рекурсия блокирует главный поток и делает страницу неинтерактивной. Для поддержания отзывчивости интерфейса всегда используйте асинхронные паттерны и избегайте синхронных бесконечных циклов. Это критично для создания плавных пользовательских интерфейсов и предотвращения зависаний.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию