导致IE冻结的Javascript代码

导致IE冻结的Javascript代码,javascript,Javascript,我有下面的代码导致Internet Explorer冻结。这是一个将学生成绩作为作业处理的项目: var array1 = StudentGradeAreadHugeList(); var nextArrayItem = function() { var grade = array1.pop(); if (grade) { nextArrayItem(); } }; 我希望您能在这方面帮助我。您可以显示有关正在尝试执行的应用程序的更多信息。但我相信这

我有下面的代码导致Internet Explorer冻结。这是一个将学生成绩作为作业处理的项目:

var array1 = StudentGradeAreadHugeList();

var nextArrayItem = function() {
    var grade = array1.pop();

    if (grade) {
        nextArrayItem();
    }
};

我希望您能在这方面帮助我。

您可以显示有关正在尝试执行的应用程序的更多信息。但我相信这是堆栈溢出的问题(可能您使用的是一个大列表)。因此,为了克服这个问题,您应该修改“nextArrayItem”:

window.setTimeout(nextArrayItem,0)


冻结主要来自大数据,但现在事件循环将处理递归过程,而不是调用堆栈。

这可能是由无休止的递归引起的。注意IE中返回值的正确处理:

var array1 = StudentGradeAreadHugeList();

var nextArrayItem = function() {
    var grade = array1.pop();

    if ( grade !== null && typeof(grade) !== "undefined" ) {
        nextArrayItem();
    }
};

空数组上的
pop()
不会返回布尔值
false
,而是返回无类型的“未定义”。

这里有两个问题:

  • 您可能超出了调用堆栈限制
  • 您的if条件设置不正确
  • 第一期: 正如前面的响应者之一所提到的,如果您有一个非常大的列表,那么您可能会超过调用堆栈的限制,因为您需要对每个元素进行递归调用。虽然执行
    setTimeout
    可能有效,但它感觉像是一个黑客解决方案。我认为真正的问题是,您的函数以递归方式而不是迭代方式处理数组。我建议使用for循环重新编写函数

    第二期:

    假设在本例中,您的数组设置为
    [100、90、80]
    。当您调用
    nextarayitem()
    时,前两次它将正常工作,但第三次调用
    nextarayitem()
    时,您将弹出最后一个剩余项(在本例中为
    100
    ),并且您的分数将设置为
    100
    ,这是一个真实值。因此,您的if条件将通过,并且您的函数错误地再次尝试调用自身,尽管您的数组现在为空,并且程序现在应该退出调用堆栈

    我试着用我在Chrome中的例子测试你的代码,结果是它会多次递归,并在空数组上调用pop,而空数组将返回未定义的

    可以通过在弹出数组后将if条件更改为检查数组中的最后一个元素来解决此问题

    见修订代码:

    var nextArrayItem = function() {
        var grade = array1.pop();
    
        if (array1[array1.length-1]) {
            nextArrayItem();
        }
    };