2013-10-20 37 views
-1

我有一個名爲MakeInput的JavaScript函數。如何防止JavaScript中的堆棧溢出錯誤?

它已經有大約150行。

而我必須在我的代碼中調用該函數約300次。

我的C#代碼通過webbrowser控件調用該函數。

它必須調用該函數300次,直到C#中的DataTable完成循環。

但也許在JavaScript的網頁瀏覽器認爲我打電話無限遞歸函數,所以當它涉及到約60倍,它總是在線路38

拋出一個錯誤稱爲堆棧溢出如何防止這種錯誤?

如何在javascript中做長時間函數?

編輯

確定。

我張貼我的代碼。

在這裏。

C#

ieBrowser.Document.InvokeScript("setPageIndex", new object[] { currentPage }); 
ieBrowser.Document.InvokeScript("fnSearch"); 

的JavaScript

function fnSearch() { 
    var frm = document.searchFrm; 
    var str = encryptData(frm, _currentPage); 
} 

function encryptData(form, _currentPage) { 
    var retValue = ""; 
    try { 
     var crypto   = document.getElementById("SomeActiveX"); 
     var resultVal  = MakeInput(form); 
     var inputStr  = ""; 

     if (resultVal[0] != "" && resultVal[1] != "") { 
      inputStr = resultVal[0] + "&" + resultVal[1]; 
     } 
     else if (resultVal[0] == "") { 
      inputStr = resultVal[1]; 
     } 
     else if (resultVal[1] == "") { 
      inputStr = resultVal[0]; 
     } 
     else { 
      inputStr = ""; 
     } 
     retValue  = crypto.Encrypt(inputStr); 
    } 
    catch (e) { 
     alert(e); 
    } 
    return retValue; 
} 

function MakeInput(form) { 
    var result = new Array(2); 
    try { 
     var keyProc = document.getElementById("SomeActiveX"); 
     var name = new Array(form.elements.length); 
     var value = new Array(form.elements.length); 
     var enc_name = new Array(); 
     var enc_value = new Array(); 
     var enc_idx = 0; 
     var j = 0; 
     var len = form.elements.length; 
     for (i = 0; i < len; i++) { 
      if ((form.elements[i].type != "button") && (form.elements[i].type != "reset") && 
       (form.elements[i].type != "submit")) { 
       if ((form.elements[i].type == "radio") || (form.elements[i].type == "checkbox")) { 
        if (form.elements[i].checked == true) { 
         name[j] = form.elements[i].name; 
         value[j] = form.elements[i].value; 
         j++; 
        } 
       } 
       else if ((form.elements[i].type == "text") || (form.elements[i].type == "password")) { 
        name[j] = form.elements[i].name; 
        value[j] = form.elements[i].value; 
        j++; 

        if (keyProc != null && (form.elements[i].getAttribute("enc") == "on")) { 
         enc_name[enc_idx] = "_E2E_" + form.elements[i].name; 
         enc_value[enc_idx] = keyProc.GetEncData("", form.name, form.elements[i].name); 
         enc_idx++; 
        } 
       } 
       else { 
        if (form.elements[i].type == "select-one") { 
         var ind = form.elements[i].selectedIndex; 
         var singleLen = form.elements[i].length; 
         if (singleLen > 0) { 
          if (ind >= 0) { 
           name[j] = form.elements[i].name; 
           value[j] = form.elements[i].options[ind].value; 
           j++; 
          } 
          else { 
          } 
         } 
         else { 
         } 
        } 
        else if (form.elements[i].type == "select-multiple") { 
         var multiLen = form.elements[i].length; 
         for (k = 0; k < multiLen; k++) { 
          if (form.elements[i].options[k].selected) { 
           name[j] = form.elements[i].name; 
           value[j] = form.elements[i].options[k].value; 
           j++; 
          } 
         } 
        } 
        else { 
         name[j] = form.elements[i].name; 
         value[j] = form.elements[i].value; 
         j++; 
        } 
       } 
      } 
     } 

     var flag1 = false; 
     var flag2 = false; 
     var signed_text = ""; 
     var unsigned_text = ""; 
     for (i = 0; i < j; i++) { 
      if (name[i].charAt(0) != "_") { 
       if (flag1) { 
        signed_text += "&"; 
       } 
       else { 
        flag1 = true; 
       } 
       signed_text += name[i]; 
       signed_text += "="; 
       signed_text += escape_url(value[i]); 
      } 
      else { 
       if (flag2) { 
        unsigned_text += "&"; 
       } 
       else { 
        flag2 = true; 
       } 
       unsigned_text += name[i]; 
       unsigned_text += "="; 
       unsigned_text += escape_url(value[i]); 
      } 
     } 

     for (i = 0; i < enc_idx; i++) { 
      if (flag2) { 
       unsigned_text += "&"; 
      } 
      else { 
       flag2 = true; 
      } 
      unsigned_text += enc_name[i]; 
      unsigned_text += "="; 
      unsigned_text += enc_value[i]; 
     } 
     if (enc_idx > 0) { 
      if (flag2) { 
       unsigned_text += "&"; 
      } 
      else { 
       flag2 = true; 
      } 

      unsigned_text += "_ENCSEED"; 
      unsigned_text += "="; 
      unsigned_text += keyProc.GetEncData(serverCert, "", ""); 
     } 
     result[0] = signed_text; 
     result[1] = unsigned_text; 
    } 
    catch (e) { 
     throw e; 
    } 
    return result; 
} 

以及錯誤消息被捕獲。

enter image description here

對不起,錯誤消息被寫入韓語。

但它說,「堆棧溢出(在第38行)」。

但我認爲數量沒有行號的指點下,怎麼把我變線,但該錯誤消息始終38.

+3

也許通過發佈代碼? – 2013-10-20 05:36:42

+0

@ user2738336你是什麼意思?你能給我一些更具體的線索嗎? –

+0

發佈你的代碼......我不知道第38行看起來像什麼。在您發佈一些代碼之前,沒有人可以幫助您。很難理解你想要用你的話做什麼。 – 2013-10-20 05:41:17

回答

0

它不會認爲你是在一個連續的循環。當內存用完時,它會失敗。相同的代碼可能在具有更高內存的計算機上工作。每次調用一個函數時,一旦堆棧函數完成,堆棧條目就會保存在堆棧中,所以在您的情況下,堆棧空間會在60次調用後耗盡。行38不是代碼中的行號。

爲什麼不在高端PC上嘗試相同的代碼

+0

感謝您的回答。我會盡量縮短代碼。 –