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