我很困惑以下循环导致IE8无限循环
for (var i in theArray) {
this.theArray.push(theArray[i]);
}
IE8陷入无限循环,我不明白为什么因为this.theArray
是一个全局数组,而theArray
是一个局部变量。
如果我有类似下面的内容,我会理解会发生无限循环:
for (var i in theArray) {
theArray.push(theArray[i]);
}
这只发生在IE8中。 IE8是否以不同的方式处理变量和范围?
修改
这是我在对象中的内容
this.theArray = new Array();
this.selection = function(theArray) {
for (var i in theArray) {
this.theArray.push(theArray[i]);
}
}
修改
我发现我将全局变量作为参数传递给函数。咄!为什么这在IE8中不起作用?
答案 0 :(得分:2)
首先,永远不要在数组上使用for in
循环。它将遍历值以及增强属性。
然后,您的代码中无法确定this
。 this
可能引用全局对象。此外,您可能错过了在本地变量中使用var
,从而使theArray
指向您要附加的同一个全局theArray
。
var theArray = [1,2,3];
function foo(){
theArray = [4,5,6]; //missing var, theArray is the global theArray
for (var i in theArray) {
//you are pushing to the same array you are fetching from
this.theArray.push(theArray[i]);
//[4,5,6,4,5,6,4,5,6,.....]
}
}
答案 1 :(得分:0)
您应该尝试self
而不是this
self
是脚本运行的窗口或框架,因此就像访问全局变量一样。
for (var i in theArray) {
self.theArray.push(theArray[i]);
}
如果这没有用,请为Arrays指定不同的变量名称。
或者:您确定theArray
是否属于本地范围?在定义`theArray之前,你是否在var
语句前加了?
var theArray
答案 2 :(得分:0)
我读这篇文章的方式应该是无限循环。您正在枚举数组并同时向其添加项目,即:
阅读索引i,创建i + 1,重复。
当您修改正在枚举的集合时,其他语言会弹出,这会让您指出错误。
我很惊讶它只在IE8中失败了。我误读了你的代码片段吗?