【发布时间】:2015-07-20 01:59:39
【问题描述】:
ES6 对尾调用优化的支持是否涵盖生成器中的尾调用?
假设我有这个整数生成器 >= 0:
var nums = function* (n) {
n = n || 0;
yield n;
yield* nums(n + 1);
};
目前,在 Chrome 和 Firefox 中,它会为每个递归调用添加一个堆栈级别,最终会遇到“超出最大调用堆栈大小”错误。一旦 ES6 完全实现,这种情况还会发生吗?
(我知道我可以迭代地编写上面的生成器而不会遇到错误。我只是好奇 TCO 是否会处理递归定义的生成器。)
【问题讨论】:
-
不确定 ES6 中的生成器和 TCO,但根据 this compatibility table,TCO 尚未在任何浏览器中实现(截至 2015 年 5 月 8 日),这解释了(部分)为什么你'重新看到调用堆栈爆炸..
-
只是说,您可以通过为
n赋予默认值0(即function* (n = 0) {)来删除函数的第一行。
标签: javascript generator ecmascript-6 tail-recursion