# 十七、尾递归优化

ES6 提供尾调用优化(TCO)，在这里您可以进行一些函数调用，而不会增加栈。这在 JavaScript 的递归和函数式编程中非常有用。

让我们看一个例子:

代码清单 210

```js
  function factorial(n, acc = 1) {

  'use strict';

  if (n <=
  1) return
  acc;

  return factorial(n - 1, n * acc);
  }

  // Stack overflow in most implementations today,
  // but safe on arbitrary inputs in ES6
  factorial(100000);

```

需要注意的是，您必须处于严格模式下，此优化才能工作。

还要注意，阶乘函数中发生的最后一件事是，它使用对自身的调用来返回值。这是函数式编程的关键规则之一，大多数函数式编程语言在处理递归时不会导致栈溢出。

总而言之，如果在 return 语句之前发生的最后一件事是调用一个不需要访问任何当前局部变量的函数，那么 ES6 指定的解释器将通过重用栈帧来优化该调用。

| ![](img/00003.gif) | 注意:在我们的浏览器有 ES6 解释器之前，这不太可能得到优化。 |