如何防止javascript中的堆栈溢出错误?

时间:2013-10-20 05:35:11

标签: c# javascript stack-overflow

我有一个名为MakeInput的javascript函数。

它有大约150行。

我必须在我的代码中调用该函数大约300次。

我的C#代码通过webbrowser控件调用该函数。

它必须调用该函数300次,直到C#中的DataTable完成循环。

但也许webbrowser中的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。

1 个答案:

答案 0 :(得分:0)

它不认为你处于一个连续的循环中。当内存在堆栈中耗尽时,它会失败。相同的代码可能适用于具有更高内存的计算机。每次调用一个函数时,堆栈条目都会保留在堆栈中,以便在函数完成后移动到calee,因此在您的情况下,堆栈空间在60次调用后耗尽。第38行不是代码中的行号。

为什么不在高端PC上尝试相同的代码