> Почему страница зависает при обработке большого массива в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Garage Eight
Стек: JavaScript
> Пример ответа
Зависание страницы при обработке большого массива в JavaScript происходит из-за однопоточной модели выполнения (single-threaded event loop). Когда выполняется синхронный код, например, цикл for с миллионом итераций, он блокирует главный поток (main thread), на котором работает рендеринг, обработка событий и другие задачи. Браузер не может обновить интерфейс или отреагировать на действия пользователя до завершения цикла.
Пример проблемы:
JAVASCRIPTconst bigArray = new Array(10000000).fill(0);bigArray.forEach(item => {// тяжёлая обработка});// Пока цикл не закончится, страница "зависнет"
Решения:
-
Разбиение на части с
setTimeout- позволяет отдать управление браузеру между итерациями:JAVASCRIPTfunction processChunk(array, index = 0) {const chunkSize = 1000;const chunk = array.slice(index, index + chunkSize);// обработать chunkif (index + chunkSize < array.length) {setTimeout(() => processChunk(array, index + chunkSize), 0);}} -
Web Workers - выполняют код в отдельном потоке, не блокируя UI:
JAVASCRIPTconst worker = new Worker('worker.js');worker.postMessage(bigArray);worker.onmessage = (e) => { /* результат */ }; -
requestAnimationFrame- для задач, связанных с анимацией или визуализацией. -
async/awaitс микротасками (например, черезsetTimeoutилиqueueMicrotask) - не решает проблему полностью, так как микротаски всё равно блокируют поток.
Выбор метода зависит от задачи: для фоновых вычислений - Web Workers, для пошаговой обработки с обновлением UI - разбиение на чанки.
> Похожие задачи по frontend
Как реализовать функцию auth через колбек в JavaScript
Что делать чтобы не блокировать основной поток при обработке большого массива без использования web workers
Как реализовать показ попапа через 3 секунды после захода на сайт с возможностью закрытия и запоминанием закрытия между сессиями?
Что делает метод json() у объекта response в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью