ES6的规格说我们提供尾部呼叫优化。但?

时间:2018-01-07 07:41:10

标签: ecmascript-6

我听说过ES6的TCO,但我无法理解,因为下面的代码无效。

function sumTailRecursion(n, accumulator) {
    if (n == 0) return accumulator;
    accumulator += n;
    return sumTailRecursion(--n, accumulator);
}

console.log(sumTailRecursion(10000, 0));   // ok!
console.log(sumTailRecursion(100000, 0));  // overflow

如果Chrome Engine使用TCO,我认为代码必须正常运行。 我知道其他基础编译器提供TCO,实际上,它们从递归变为for循环,因此堆栈的恶化不存在。
我想知道这个问题的原因。我有任何机会理解错误吗?

1 个答案:

答案 0 :(得分:0)

在线阅读Tail Call Optimization,我发现了一篇很棒的文章http://benignbemine.github.io/2015/07/19/es6-tail-calls/

TCO的工作原理是:

  • 在return语句之前需要评估的最后一件事是函数调用
  • 在解释器需要记住执行的函数调用之后没有任何操作
  • 下一个递归调用不需要访问当前堆栈帧中的任何局部变量

我认为您的代码符合上述规则。

您可能需要在此处检查浏览器的兼容性: https://kangax.github.io/compat-table/es6/#chrome62