递归javascript函数导致;超过最大调用堆栈大小;

递归javascript函数导致;超过最大调用堆栈大小;,javascript,recursion,Javascript,Recursion,在设计一个小型API的过程中,为了使我的函数尽可能灵活,我决定开始添加参数是否传递的检查,然后在此基础上,做不同的事情。因此,当使用数字调用函数时,该函数将该数字用作数组中的索引。如果没有传递任何数字,我希望函数调用自身的次数与数组长度相同。但是我得到了调用堆栈错误。我已经将问题归结为函数的递归方面,我在下面列出。对我来说最奇怪的是 这会导致错误 function testing(a){ if(!a){ for(var i = 0; i < 3; i += 1){

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

这会导致错误

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

testing();

都没有用。这让我抓狂,我想知道这里发生了什么。

如果
a==0
它是
false
,这意味着你有一个无限循环

有关更多详细信息,请阅读并(谢谢@yochannah)

这很好用

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

testing();
功能测试(a){
如果(!a | | a==0){

对于(var i=1;i),似乎在循环的第一次迭代中每次都要传递0,所以它总是要传递
if(!a)
,然后启动另一个递归调用,这反过来也会做同样的事情。下面是一篇关于真实性/错误性的文章,这就是为什么在js中会发生这种情况:
testing(function(i){return i;}(i));
function testing(a){
  if(!a || a == 0){
    for(var i = 1; i <= 3; i++){
      testing(i);
    }
  } else {
    alert(a);
  }
};

testing();