Вам интересно, сколько рекурсивных вызовов можно сделать с помощью двигателя JavaScript?
Сколько рекурсивных звонков
Следующая функция позволяет вам найти ответ: (Вдохновленный суть Бена Альмана)
Кода -копия выглядит следующим образом:
Function ComputeMaxCallStAckSize () {
пытаться {
вернуть 1 + computeMaxCallStakSize ();
} catch (e) {
// переполнение стека вызовов
возврат 1;
}
}
Три результата:
Кода -копия выглядит следующим образом:
Node.js: 11034
Firefox: 50994
Хром: 10402
Что представляют эти цифры? Г -н Алеф указал, что в V8 количество рекурсивных вызовов зависит от двух величин: размер стека и размер кадра стека (локальная переменная, которая содержит параметры). Вы можете убедиться, что, добавив локальные переменные в ComputeMaxCallStakSize () - он возвращает низкое значение.
Оптимизация хвостовых вызовов в Ecmascript 6
ES6 имеет оптимизацию вызовов: если последний шаг в функции также является вызовом функции, он будет «прыгнуть» вместо того, чтобы вызвать подфункцией. Это означает, что в ES6 (строгий режим) вам просто нужно немного изменить функцию ComputEmaxCallStAckSize, и ее можно выполнить навсегда.
Кода -копия выглядит следующим образом:
Функция ComputerEmaxCallStAckSize (size) {
размер = размер || 1;
return ComputeMaxCallStAckSize (размер + 1);
}