Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是尾声吗?(Javascript)_Javascript_Tail Call Optimization - Fatal编程技术网

这是尾声吗?(Javascript)

这是尾声吗?(Javascript),javascript,tail-call-optimization,Javascript,Tail Call Optimization,假设您有一个递归函数,如: Blah.prototype.add = function(n) { this.total += n; this.children.forEach(function(child) { child.add(n); }); }; child.add()是尾部调用吗?如果不是的话,它能写出来吗? 目前的JavaScript不会对此进行优化 另一个选择是蹦床 是的,这是一个尾部调用: function(child) { chi

假设您有一个递归函数,如:

Blah.prototype.add = function(n) {
    this.total += n;
    this.children.forEach(function(child) {
        child.add(n);
    });
};
child.add()
是尾部调用吗?如果不是的话,它能写出来吗?

目前的JavaScript不会对此进行优化

另一个选择是蹦床
是的,这是一个尾部调用:

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
};
Blah.prototype.add=函数(n){
“严格使用”;
总+=n;
设l=this.children.length;
如果(!l--)
返回;

for(让i=0;iI这样说。即使它在一个循环中,它仍然是执行的最后一个操作。我不确定…我正在考虑一个传统的
for(i=0;i可能JS中的
tail调用
将使用
return someFn()
也允许垃圾收集initator函数。forEach()当数组被迭代时,不会看到被推入数组中的项…这是回调函数中的尾部调用,但是
forEach
仍然需要保持其循环状态。因此,这与
for
循环之间的堆栈使用率几乎没有差别。是的,我认为优化还没有到位,但我正在尝试做好准备。感谢链接。您链接的问题已经过时。ES6正在进行适当的尾部呼叫优化。假设其正确,则从开始就没有任何东西会使用它today@exussum:是的,草案还没有被接受,但是所有的功能已经在引擎中逐步实现。正如你所看到的,一些Transpiler已经阅读了y已经进行了优化。虽然我同意链接仍然是最新的。早期采用可以更改,但没有任何内容包含尾部优化。可能会有语法更改以允许尾部调用优化。这是未知的,除非您遵循草稿,否则无法实现。您确定
添加
是尾部递归的吗?即使如果使用imple for loop构造,则执行的最新操作将是循环条件检查,因此不会是尾部递归的,不是吗?我认为递归调用必须是算法尾部递归的最新执行表达式。@plalx:我没有说
add
是尾部递归的。如果它与forEach
及其回调-它不调用自身。我只是说,
add
包含尾部调用。谢谢,是的,我应该清楚我问的是child.add是否是add函数的尾部调用,而不是forEach回调。@pixelmike:调用只能相对于当前执行的函数处于尾部位置。Func调用堆栈或词法范围中其他位置的选项无关紧要。(您必须稍微向上滚动,顶部的横幅会遮挡目标)。您能否指出它在规范中定义的
child.add(n)
位于
forEach
回调的尾部位置?