ES6 尾调用优化是否涵盖生成器?

Does ES6 Tail Call Optimization Cover Generators?

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

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

var nums = function* (n) {
    n = n || 0;
    yield n;
    yield* nums(n + 1);
};

目前,在 Chrome 和 Firefox 中,它会为每个递归调用添加一个堆栈级别,并最终 运行 进入 "maximum call stack size exceeded" 错误。一旦 ES6 完全实现,这种情况还会发生吗?

(我知道我可以迭代地编写上面的生成器而不是 运行 到错误中。我只是好奇 TCO 是否会处理递归定义的生成器。)

调用函数时,根据Function call evaluation

部分
  1. Let tailCall be IsInTailPosition(thisCall)
  2. Return ? EvaluateCall(func, ref, arguments, tailCall)

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

  1. If body is the FunctionBody of a GeneratorBody, return false.

所以,如果函数体是一个生成器,那么尾调用优化就不会做。