ES6中的尾调用优化为什么不在严格模式下也可以使用?

正在看阮一峰所著的ES6入门,发现有个内容前后矛盾。

clipboard.png
书中所说,尾调用优化只在严格模式下开启,但是我使用它尾调用优化后的代码跑,并未开启严格模式也可以正常跑,确实是使用了尾调用优化的。

function Fibonacci2 (n , ac1 = 1 , ac2 = 1) {
  if( n <= 1 ) {return ac2};

  return Fibonacci2 (n - 1, ac2, ac1 + ac2);
}

Fibonacci2(100) // 573147844013817200000
Fibonacci2(1000) // 7.0330367711422765e+208
Fibonacci2(10000) // Infinity

我自己本地跑了也确实可以很快跑出来,没有卡死,确实是优化了的,但是这里并没有开启严格模式

阅读 2.6k
3 个回答

我试了一下,在safari浏览器中,非严格模式下能够正常执行Fibonacci2(10000),但是不能正常执行Fibonacci2(100000)。

你可以将Fibonacci2的参数再增大一点。

我猜不同环境下,JS函数的调用栈大小不同,导致你以为非严格模式下尾递归优化开启了。

应该没有矛盾的,可以使用safari看一下call stack, 做了尾调用优化的call stack上当前只有最近的调用,其他调用都是灰色的,也就是已经从call stack上删掉了。
注意:
1,当前尾调用优化只在safari上有效,即使chrome或者node使用的v8引擎也暂时没有此优化;
2,当前尾调用优化只有在严格模式上有效;
3,对于es6新增的一些函数特性,比如有默认值参数的函数是不能开启严格模式的。

因此, 当前环境下,尾调用优化还是相当局限的。

clipboard.png

浏览器会自动优化的。

推荐问题