ES6对尾调用优化的支持是否涵盖了生成器中的尾调用?
假设我有一个整数生成器> = 0:
var nums = function* (n) {
n = n || 0;
yield n;
yield* nums(n + 1);
};
目前,在Chrome和Firefox中,它会在每次递归调用时添加一个堆栈级别,并最终遇到超过"最大调用堆栈大小"错误。一旦ES6完全实现,这仍然会发生吗?
(我知道我可以迭代地编写上面的生成器而不会遇到错误。我只是好奇TCO是否会处理递归定义的生成器。)
答案 0 :(得分:4)
进行函数调用时,根据Function call evaluation部分
- 让 tailCall 成为IsInTailPosition( thisCall )
- 回来? EvaluateCall( func,ref,arguments,tailCall )
醇>
将根据IsInTailPosition
的结果评估呼叫。如果我们检查IsInTailPosition
,
- 如果body是 GeneratorBody 的 FunctionBody ,请返回 false 。
醇>
因此,如果函数体是生成器,则不会执行Tail Call Optimization。