导致“超出最大调用堆栈大小”的递归javascript函数

时间:2013-12-31 16:05:53

标签: javascript recursion

在设计工作中的小API并尽量使我的函数尽可能灵活的过程中,我决定开始添加是否传递参数的检查,然后基于此,做不同的事情。因此,当使用数字调用函数时,该函数将数字用作数组中的索引。如果没有传递数字,我希望函数调用自身的次数与数组的长度一样多。但是我得到了调用堆栈错误。我把问题归结为函数的递归方面,我将在下面列出。对我来说最奇怪的是......

这会导致错误

function testing(a){
    if(!a){
        for(var i = 0; i < 3; i += 1){
            testing(i);
        }
    }else{
        alert(a);
    }
}

testing();

这不会导致错误

function testing(a){
    if(!a){
        for(var i = 0; i < 3; i += 1){
            testing(5);//Just adding hard coded number instead
        }
    }else{
        alert(a);
    }
}

testing();

我试图理解为什么在调用中传递var会引发错误。似乎如果js引擎可以在内存中保存初始函数调用以使for循环正常工作,为什么它在调用自身时不能保持对i的引用?我觉得我在这里缺少一些基本的东西。我尝试过很多重写,包括:

testing(function(i){return i;}(i));

一切都无济于事。这让我发疯,我想了解这里发生了什么。

2 个答案:

答案 0 :(得分:9)

如果a===0false,则表示您拥有无限循环

了解更多详情,请阅读thisthis(感谢@yochannah)

答案 1 :(得分:1)

这很好用。

function testing(a){
  if(!a || a == 0){
    for(var i = 1; i <= 3; i++){
      testing(i);
    }
  } else {
    alert(a);
  }
};

testing();

显然,不需要从1启动循环计数器并检查是否a == 0,但两种方法都可以。

编辑:您可以进行的另一项检查是(a == undefined)。

当您使用0进行检查时,返回!的变量为false。