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