ES6尾部呼叫优化封面生成器?

and*_*dyk 7 javascript tail-recursion generator ecmascript-6

ES6对尾调用优化的支持是否涵盖了生成器中的尾调用?

假设我有一个整数> = 0的生成器:

var nums = function* (n) {
    n = n || 0;
    yield n;
    yield* nums(n + 1);
};
Run Code Online (Sandbox Code Playgroud)

目前,在Chrome和Firefox中,它会在每次递归调用时添加堆栈级别,并最终遇到"超出最大调用堆栈大小"错误.一旦ES6完全实现,这仍然会发生吗?

(我知道我可以迭代地编写上面的生成器而不会遇到错误.我只是想知道TCO是否会处理递归定义的生成器.)

the*_*eye 6

当进行函数调用时,根据函数调用评估部分,

  1. tailCall为 IsInTailPosition( thisCall )
  2. 返回 ?EvaluateCall( func, ref, arguments, tailCall )

调用将根据IsInTailPosition的结果进行评估。如果我们检查IsInTailPosition

  1. 如果身体是函数体一的GeneratorBody,返回

因此,如果函数体是生成器,则不会进行尾调用优化。

  • 你认为这个限制的原因是什么? (6认同)