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、
部分
- Let tailCall be IsInTailPosition(thisCall)
- Return ? EvaluateCall(func, ref, arguments, tailCall)
调用将根据 IsInTailPosition
的结果进行评估。如果我们检查 IsInTailPosition
、
- If body is the FunctionBody of a GeneratorBody, return false.
所以,如果函数体是一个生成器,那么尾调用优化就不会做。
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、
部分
- Let tailCall be IsInTailPosition(thisCall)
- Return ? EvaluateCall(func, ref, arguments, tailCall)
调用将根据 IsInTailPosition
的结果进行评估。如果我们检查 IsInTailPosition
、
- If body is the FunctionBody of a GeneratorBody, return false.
所以,如果函数体是一个生成器,那么尾调用优化就不会做。