and*_*dyk 7 javascript tail-recursion generator ecmascript-6
ES6对尾调用优化的支持是否涵盖了生成器中的尾调用?
假设我有一个整数> = 0的生成器:
var nums = function* (n) {
n = n || 0;
yield n;
yield* nums(n + 1);
};
Run Code Online (Sandbox Code Playgroud)
目前,在Chrome和Firefox中,它会在每次递归调用时添加堆栈级别,并最终遇到"超出最大调用堆栈大小"错误.一旦ES6完全实现,这仍然会发生吗?
(我知道我可以迭代地编写上面的生成器而不会遇到错误.我只是想知道TCO是否会处理递归定义的生成器.)
当进行函数调用时,根据函数调用评估部分,
- 令tailCall为 IsInTailPosition( thisCall )
- 返回 ?EvaluateCall( func, ref, arguments, tailCall )
调用将根据IsInTailPosition的结果进行评估。如果我们检查IsInTailPosition,
- 如果身体是函数体一的GeneratorBody,返回假。
因此,如果函数体是生成器,则不会进行尾调用优化。
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |