Tail Call Optimization (TCO) — это техника, которая позволяет функции переиспользовать текущий stack frame при выполнении tail call — вызова функции, который является последней операцией перед возвратом.
Обычно каждый рекурсивный вызов добавляет новый frame в call stack. С TCO, если рекурсивный вызов находится в tail position, движок может заменить текущий frame вместо того, чтобы добавлять новый, предотвращая ошибки stack overflow.
Функция в tail position выглядит вот так:
function factorial(n, acc = 1) {
if (n <= 1) return acc;
return factorial(n - 1, n * acc); // tail call
}
Ключевое отличие в том, что рекурсивный вызов — это последняя операция — никаких дополнительных действий не происходит после его возврата.
Сравни это с non-tail-recursive версией:
function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1); // НЕ tail call — умножение происходит после
}
TCO была введена в спецификацию ES2015, но поддержка неравномерна:
Поскольку TCO не поддерживается стабильно во всех основных движках JavaScript, разработчики обычно используют итеративные циклы или trampolining как более безопасные альтернативы глубокой рекурсии в production-коде.
Tail call optimization позволяет функции переиспользовать текущий stack frame, когда рекурсивный вызов является последней операцией перед return, предотвращая stack overflow ошибки.
Новый — ещё не проверен сообществом
Вы