簡體   English   中英

導致“超出最大調用堆棧大小”的遞歸javascript函數

[英]Recursive javascript function causing “Maximum call stack size exceeded”

在設計工作中的小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));

一切都無濟於事。 這讓我發瘋,我想了解這里發生了什么。

如果a===0則為false ,這意味着你有一個無限循環

有關詳細信息,請閱讀這個這個 (感謝@yochannah)

這很好用。

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的變量是假的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM