让你有一个递归函数,如:
Blah.prototype.add = function(n) {
this.total += n;
this.children.forEach(function(child) {
child.add(n);
});
};
child.add()
是否有尾巴通话?如果不能这样写的话呢?
答案 0 :(得分:1)
Are any Javascript engines tail call optimized?
JavaScript目前不会针对该
进行优化答案 1 :(得分:1)
是的,这是一个尾调:
function(child) {
child.add(n);
// ^ tail
}
然而这里没有任何东西是尾递归的,因为它不是直接的递归调用。
同样this.children.forEach(…)
是add
方法中的尾调用。
但是,在本机forEach
方法中调用回调可能不是尾调用优化的(除了最后一个之外的所有方法都不能)。您可以通过将函数重写为
Blah.prototype.add = function(n) {
"use strict";
this.total += n;
let l = this.children.length;
if (!l--)
return;
for (let i=0; i<l; i++)
this.children[i].add(n);
this.children[i].add(n); // tail-recursion
};
请注意,如果您还没有return
他们的结果,这些尾调用都不会优化。