导致IE冻结的Javascript代码
Javascript code causing IE freeze
我有以下代码导致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]
。当您调用nextArrayItem()
时,它将在前两次正常工作,但是第三次调用nextArrayItem()
时,您将弹出最后一个剩余的项目(在本例中为 100
),并且您的成绩将设置为 100
这是一个真实值。因此,你的 if 条件将传递,你的函数错误地尝试再次调用自身,尽管你的数组现在是空的,程序现在应该退出调用堆栈。
我尝试使用我在 Chrome 中的示例测试您的代码,发生的事情是它会递归太多次并在空数组上调用 pop,这将返回 undefined。
您可以通过更改 if 条件来解决此问题,以便在弹出数组后检查数组中的最后一个元素。
请参阅修订后的代码:
var nextArrayItem = function() {
var grade = array1.pop();
if (array1[array1.length-1]) {
nextArrayItem();
}
};
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 面向对象的Javascript代码在IE7中不起作用
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- JavaScript代码问题:我正在将对象转换为数组
- Javascript阻止其他Javascript代码
- JavaScript代码未正确检查ajax请求
- 如何调试Javascript代码或函数
- 为什么我在这个javaScript代码中使用NaN
- 将javascript代码转换为jquery代码时出错
- 如何从Objective-C代码中调用javascript代码
- 有什么工具可以轻松读取javascript代码吗
- 这个javascript代码是如何编写的
- 如何解密此javascript代码
- SIMPLE Javascript代码,用于显示谷歌电子表格中单个字段的数据
- HTML标记,包含带引号的JavaScript代码中的引号
- 如何在Win8Metro应用程序的Javascript代码中捕获自己的C#事件
- addEventListener的Javascript代码不工作!?(单击时打开放大的img)
- JavaScript代码无法在表单上呈现部分
- 以下 JavaScript 代码与 Facebook 相关
- 使用解析为javascript源的.php,如何使用条件语句将javascript代码封装在php括号之间