导致IE冻结的Javascript代码

Javascript code causing IE freeze

本文关键字:Javascript 代码 冻结 IE 导致      更新时间:2023-09-26

我有以下代码导致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而是返回无类型的"未定义"。

这里有两个问题:

  1. 您可能超出了调用堆栈限制
  2. 您的 if 条件设置不正确

对于第一个问题:正如前面的响应者之一提到的,如果你有一个非常大的列表,你可能会超过调用堆栈的限制,因为你需要对每个元素进行递归调用。虽然做setTimeout可能会奏效,但感觉就像一个黑客解决方案。我认为真正的问题是您的函数正在递归而不是迭代地处理数组。我建议使用 for 循环重写您的函数。

对于第二个问题:

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

我尝试使用我在 Chrome 中的示例测试您的代码,发生的事情是它会递归太多次并在空数组上调用 pop,这将返回 undefined。

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

请参阅修订后的代码:

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