我有以下代码导致Internet Explorer冻结。这是一个涉及将学生成绩作为一项任务处理的项目:
var array1 = StudentGradeAreadHugeList();
var nextArrayItem = function() {
var grade = array1.pop();
if (grade) {
nextArrayItem();
}
};
我希望你能帮助我。
答案 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)
这里有两个问题:
第一期:
正如之前的响应者之一所提到的,如果你有一个非常大的列表,你可以超出调用堆栈的限制,因为你需要对每个元素进行递归调用。虽然做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();
}
};