ES6 对尾调用优化的支持是否涵盖生成器中的尾调用?
假设我有这个 >= 0 的整数生成器:
var nums = function* (n) {
n = n || 0;
yield n;
yield* nums(n + 1);
};
目前,在 Chrome 和 Firefox 中,它会为每个递归调用添加一个堆栈级别,最终会遇到“超出最大调用堆栈大小”错误。一旦 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.
所以,如果函数体是一个生成器,那么尾调用优化就不会做。
关于javascript - ES6 尾调用优化是否涵盖生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30135916/