导致IE冻结的Javascript代码
我有下面的代码导致Internet Explorer冻结。这是一个将学生成绩作为作业处理的项目:导致IE冻结的Javascript代码,javascript,Javascript,我有下面的代码导致Internet Explorer冻结。这是一个将学生成绩作为作业处理的项目: var array1 = StudentGradeAreadHugeList(); var nextArrayItem = function() { var grade = array1.pop(); if (grade) { nextArrayItem(); } }; 我希望您能在这方面帮助我。您可以显示有关正在尝试执行的应用程序的更多信息。但我相信这
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
,而是返回无类型的“未定义”。这里有两个问题:
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();
}
};