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

时间:2015-05-09 04:14:43

标签: javascript generator ecmascript-6 tail-recursion

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

进行函数调用时,根据Function call evaluation部分

  
      
  1. tailCall 成为IsInTailPosition( thisCall
  2.   
  3. 回来? EvaluateCall( func,ref,arguments,tailCall
  4.   

将根据IsInTailPosition的结果评估呼叫。如果我们检查IsInTailPosition

  
      
  1. 如果body是 GeneratorBody FunctionBody ,请返回 false
  2.   

因此,如果函数体是生成器,则不会执行Tail Call Optimization。