ES6 включает в себя поддержку оптимизации хвостовых вызовов. Однако это в стандарте, на деле стоит смотреть какой из браузеров поддерживает эту функциональность. Оптимизация хвостовых вызовов выполняется только в строгом режиме.
Оптимизация хвостовых вызовов возможна при условии, оптимизируемый вызов находится в хвостовой позиции, если:
Вызов функции является последним выражением функции;
Вызовы функции находятся в тернарном операторе (? :);
Логический И (||);
Логический ИЛИ (&&);
Оператор запятой (,);
Тогда точка возврата в родительскую функцию уже не нужна и фрейм этой функции может быть сброшен со стека.
В ES6 не имеет значения какую именно функцию вы вызываете:
Функию
Метод
Прямой вызов метода
Косвенные вызовы метода
// Both f() and g() are in tail position.consta= x => (x ?f() :g());// f() is not in a tail position, but g() is in a tail position.consta= () =>f() ||g();// f() is not in a tail position, but g() is in a tail position.consta= () =>f() &&g();// f() is not in a tail position, but g() is in a tail position.consta= () => (f(),g());
Отдельные вызовы функций не находятся в хвостовой позиции:
function foo() {
bar(); // this is not a tail call in JS
}
function foo() {
bar();
return undefined;
}
// Should be
function foo() {
return bar(); // tail call
}