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

问题描述 投票:0回答:2

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

它有大约150行。

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

我的 C# 代码通过网络浏览器控件调用该函数。

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

但是可能webbrowser中的javascript认为我调用的是无限递归函数,所以到了60次左右的时候,总是在第38行抛出stack overflow的错误。

我怎样才能防止这个错误?

如何在 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.

c# javascript stack-overflow
2个回答
0
投票

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

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


0
投票

我面临同样的情况。可以打破功能并重新启动它来解决问题吗?如何中断清除堆栈以防止溢出?可行吗?

© www.soinside.com 2019 - 2024. All rights reserved.