> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/c-functions/c1-functions/03.iv-tail-call-optimization-es6.md).

# 03.iv Tail-call optimization

ES6 включает в себя поддержку оптимизации хвостовых вызовов. Однако это в стандарте, на деле стоит смотреть какой из браузеров поддерживает эту функциональность. Оптимизация хвостовых вызовов выполняется только в строгом режиме.

Оптимизация хвостовых вызовов возможна при условии, оптимизируемый вызов находится в хвостовой позиции, если:

* Вызов функции является последним выражением функции;
* Вызовы функции находятся в тернарном операторе (`? :`);
* Логический И (`||`);
* Логический ИЛИ (`&&`);
* Оператор запятой (`,`);

Тогда точка возврата в родительскую функцию уже не нужна и фрейм этой функции может быть сброшен со стека.

В ES6 не имеет значения какую именно функцию вы вызываете:

* Функию
* Метод
* Прямой вызов метода
* Косвенные вызовы метода

```javascript
// 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());
```

Отдельные вызовы функций не находятся в хвостовой позиции:

```javascript
function foo() {
  bar(); // this is not a tail call in JS
}

function foo() {
  bar();
  return undefined;
}

// Should be
function foo() {
  return bar(); // tail call
}
```
