03.iv Tail-call optimization
ES6 включает в себя поддержку оптимизации хвостовых вызовов. Однако это в стандарте, на деле стоит смотреть какой из браузеров поддерживает эту функциональность. Оптимизация хвостовых вызовов выполняется только в строгом режиме.
Оптимизация хвостовых вызовов возможна при условии, оптимизируемый вызов находится в хвостовой позиции, если:
Вызов функции является последним выражением функции;
Вызовы функции находятся в тернарном операторе (
? :
);Логический И (
||
);Логический ИЛИ (
&&
);Оператор запятой (
,
);
Тогда точка возврата в родительскую функцию уже не нужна и фрейм этой функции может быть сброшен со стека.
В ES6 не имеет значения какую именно функцию вы вызываете:
Функию
Метод
Прямой вызов метода
Косвенные вызовы метода
// Both f() and g() are in tail position.
const a = x => (x ? f() : g());
// f() is not in a tail position, but g() is in a tail position.
const a = () => f() || g();
// f() is not in a tail position, but g() is in a tail position.
const a = () => f() && g();
// f() is not in a tail position, but g() is in a tail position.
const a = () => (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
}
Last updated
Was this helpful?