导致IE冻结的Javascript代码

时间:2014-12-24 06:35:35

标签: javascript

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

var array1 = StudentGradeAreadHugeList();

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

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

我希望你能帮助我。

3 个答案:

答案 0 :(得分:2)

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

window.setTimeout (nextArrayItem, 0)

冻结主要来自大数据,但现在Event Loop将处理Recursion进程,而不是你的Call Stack。

答案 1 :(得分:0)

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

var array1 = StudentGradeAreadHugeList();

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

    if ( grade !== null && typeof(grade) !== "undefined" ) {
        nextArrayItem();
    }
};
空数组上的

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

答案 2 :(得分:0)

这里有两个问题:

  1. 您可能超出了调用堆栈限制
  2. 您的if条件设置不正确
  3. 第一期: 正如之前的响应者之一所提到的,如果你有一个非常大的列表,你可以超出调用堆栈的限制,因为你需要对每个元素进行递归调用。虽然做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();
        }
    };