Максимальное количество (рекурсивных или нет, неважно) вызовов определяется (1) размером доступного стекового пространства, деленным на (2) размер каждого стекового кадра активной (ых) функции (й).
(1) имеет верхний предел, установленный операционной системой;в системах, о которых я знаю, обычно это от 1 до 8 МБ.Ниже этого предела движок JavaScript может установить собственное ограничение.V8 устанавливает ограничение чуть менее одного мегабайта на всех платформах, чтобы разные платформы вели себя как можно ближе друг к другу.Я не знаю, что делает Safari / JavaScriptCore.
(2) зависит от деталей реализации механизма JavaScript (в частности, от того, сколько слотов в каждом фрейме стека он использует для внутренних данных), а также отколичество локальных переменных в каждой из задействованных функций.
Как вы заметили, обычно предел достигает стека только в случае случайной бесконечной рекурсии.Таким образом, для большинства реальных приложений конкретное значение ограничения не имеет значения, и больший стек не дает никаких преимуществ.
Обратите внимание, что пространство стека не связано с максимальным потреблением памяти (иначе пространство кучи).Вы можете иметь гигабайты кучи только с мегабайтом стека.