Проверяет понимание механизма переполнения стека вызовов и его отличия от очереди задач в JavaScript.
JavaScript использует стек вызовов для отслеживания выполняемых функций. Каждый вызов функции добавляет новый фрейм в стек, а возврат из функции удаляет его. Стек имеет ограниченный размер, определяемый движком (обычно около 10 000–15 000 фреймов).
Когда функция вызывает саму себя без базового условия, каждый вызов добавляет фрейм в стек. Рано или поздно стек заполняется, и движок выбрасывает ошибку RangeError: Maximum call stack size exceeded. Это происходит синхронно, до того как очередь задач получит возможность выполниться.
function infinite() {
return infinite();
}
infinite(); // RangeError: Maximum call stack size exceededОчередь задач содержит колбэки, ожидающие выполнения (например, таймеры, события). Event loop обрабатывает очередь только после того, как стек вызовов станет пустым. При бесконечной рекурсии стек никогда не опустошается, поэтому очередь задач не обрабатывается, но и не переполняется — она просто ждёт.
setTimeout(() => console.log('task'), 0);
function recurse() {
recurse(); // переполнение стека
}
recurse(); // ошибка, 'task' не выведетсяОшибка прерывает выполнение, но очередь задач остаётся нетронутой. После перехвата ошибки event loop продолжит обрабатывать очередь.
Бесконечная рекурсия приводит к переполнению стека, но не влияет на очередь задач. Это важно понимать для отладки и написания безопасных рекурсивных функций, особенно при работе с большими данными или глубокими структурами.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию