Spec-Zone.ru › JavaScript

InternalError: слишком большая рекурсия

Исключение JavaScript "too much recursion" (слишком большая рекурсия) или "Maximum call stack size exceeded" (превышен максимальный размер стека вызовов) возникает, когда происходит слишком много вызовов функций или когда в функции отсутствует базовый случай.

Сообщение

RangeError: Maximum call stack size exceeded (Chrome)
InternalError: too much recursion (Firefox)
RangeError: Maximum call stack size exceeded. (Safari)

Тип ошибки

InternalError в Firefox; RangeError в Chrome и Safari.

Что пошло не так?

Функция, которая вызывает саму себя, называется рекурсивной функцией. Как только условие выполнено, функция прекращает вызывать себя. Это называется базовым случаем.

В некотором смысле рекурсия аналогична циклу. Оба выполняют один и тот же код несколько раз, и оба требуют условия (чтобы избежать бесконечного цикла, или, в данном случае, бесконечной рекурсии). Когда происходит слишком много вызовов функций или в функции отсутствует базовый случай, JavaScript выдаст эту ошибку.

Примеры

Эта рекурсивная функция запускается 10 раз, согласно условию выхода.

function loop(x) {
  if (x >= 10)
    // "x >= 10" is the exit condition
    return;
  // do stuff
  loop(x + 1); // the recursive call
}
loop(0);

Установка этого условия на чрезвычайно высокое значение не сработает:

function loop(x) {
  if (x >= 1000000000000) return;
  // do stuff
  loop(x + 1);
}
loop(0);

// InternalError: too much recursion

В этой рекурсивной функции отсутствует базовый случай. Поскольку условие выхода отсутствует, функция будет вызывать себя бесконечно.

function loop(x) {
  // The base case is missing
  loop(x + 1); // Recursive call
}

loop(0);

// InternalError: too much recursion

Ошибка класса: слишком большая рекурсия

class Person {
  constructor() {}
  set name(name) {
    this.name = name; // Recursive call
  }
}

const tony = new Person();
tony.name = "Tonisha"; // InternalError: too much recursion

Когда значение присваивается имени свойства (this.name = name;), JavaScript должен установить это свойство. Когда это происходит, запускается функция-сеттер.

В этом примере, когда сеттер запускается, ему предписывается сделать то же самое снова: установить то же свойство, которым он должен управлять. Это приводит к тому, что функция вызывает саму себя снова и снова, делая рекурсию бесконечной.

Эта проблема также возникает, если та же самая переменная используется в геттере.

class Person {
  get name() {
    return this.name; // Recursive call
  }
}

Чтобы избежать этой проблемы, убедитесь, что свойство, которому присваивается значение внутри функции-сеттера, отличается от того, которое изначально вызвало сеттер. То же самое относится и к геттеру.

class Person {
  constructor() {}
  set name(name) {
    this._name = name;
  }
  get name() {
    return this._name;
  }
}
const tony = new Person();
tony.name = "Tonisha";
console.log(tony);

Смотрите также

  • Рекурсия
  • Рекурсивные функции

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Too_much_recursion

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API