javascript - ES6 尾调用优化是否涵盖生成器?

标签 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 是否会处理递归定义的生成器。)

最佳答案

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

  1. Let tailCall be IsInTailPosition(thisCall)
  2. Return ? EvaluateCall(func, ref, arguments, tailCall)

调用将根据 IsInTailPosition 的结果进行评估。如果我们检查 IsInTailPosition ,

  1. If body is the FunctionBody of a GeneratorBody, return false.

所以,如果函数体是一个生成器,那么尾调用优化就不会做。

关于javascript - ES6 尾调用优化是否涵盖生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30135916/

相关文章:

javascript - AJAX 加载调用 javascript 函数的 PHP 页面

javascript - 在 Angular 中创建多维/嵌套对象(嵌套 forEach 循环)

python - 如何在生成器中使用 python 上下文管理器

javascript - 当属性不相同时过滤数组属性的值

javascript - 图像/svg+xml 格式的 Mandrill base64 内联图像在电子邮件中不可见?

javascript 正则表达式替换,如何提供正则表达式条件(和标志)作为变量而不是内联?

javascript - 使用生成器暂停直到 promise 解决

python 基础级生成器和列表问题

javascript - React - 使用状态之外的函数设置组件状态,这是错误的吗?

javascript - Angular 2.0 : Does Typescript support all the features of ES6?