17.md 1.1 KB
Newer Older
W
wizardforcel 已提交
1 2
# 十七、尾递归优化

W
wizardforcel 已提交
3
ES6 提供尾调用优化(TCO),在这里您可以进行一些函数调用,而不会增加栈。这在 JavaScript 的递归和函数式编程中非常有用。
W
wizardforcel 已提交
4 5 6 7 8

让我们看一个例子:

代码清单 210

W
wizardforcel 已提交
9
```js
W
wizardforcel 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  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);

```

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

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

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

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