Выбор ответа Junior Ошибки обновлено

Ошибка бесконечной рекурсии

Вопрос

Какая ошибка возникнет при вызове функции?

function countDown(n) {
  return countDown(n - 1);
}
countDown(10);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: RangeError: Maximum call stack size exceeded. Без базового случая каждый вызов добавляет кадр в стек вызовов, и при достижении лимита движок бросает RangeError с сообщением про размер стека.

Варианты ответа

  1. RangeError: Maximum call stack size exceededправильный ответ
  2. Функция зависнет навсегда без ошибки, как цикл while (true)
  3. TypeError: countDown is not a function
  4. SyntaxError: у рекурсивной функции нет условия выхода

Разбор

Без базового случая каждый вызов добавляет кадр в стек вызовов, и при достижении лимита движок бросает RangeError с сообщением про размер стека. Бесконечного зависания не будет: стек конечен, в отличие от бесконечного цикла while. Функция существует, так что не TypeError. Парсер не проверяет условия выхода, синтаксически код верный. Хвостовую оптимизацию рекурсии из ES2015 реализовал только Safari, в V8 её нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме