Доброго времени суток. Не могу понять, почему копятся стеки вызовов функций в хвостовой рекурсии, если результаты предыдущего вызова далее не используются. Например:
function foo(x, acc) {
if (x < 2) {
return acc;
}
return foo(x - 1, acc * x);
}
foo(100000, 1); // Maximum call stack size exceeded
Ответ
Стандарт содержит следующее упоминание
Tail Position calls are only defined in strict mode code because of a common non-standard language extension (see 9.2.7) that enables observation of the chain of caller contexts.
Хвостовые вызовы могут быть определены только в strict mode, из-за нестандартного расширения языка (см 9.2.7), которое позволяет следить за цепочкой вызываемых контекстов.
Таким образом в соответствии со стандартом, хвостая рекурсия в строгом режиме будет обработана правильно.
Поддерживаемость на данный момент оставляет желать лучшего
Ну и да, как уже упоминалось: в примере в вопросе не хвостовая рекурсия, для нее нужно добавить return, а так же указать strict mode, в итоге код должен принять следующий вид
function foo(x, acc) {
'use strict'
if (x < 2) {
return acc;
}
return foo(x - 1, acc * x);
}
Комментариев нет:
Отправить комментарий