IE8陷入无限循环阵列推送

时间:2012-05-03 08:06:59

标签: javascript

我很困惑以下循环导致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中不起作用?

3 个答案:

答案 0 :(得分:2)

首先,永远不要在数组上使用for in循环。它将遍历值以及增强属性。

然后,您的代码中无法确定thisthis可能引用全局对象。此外,您可能错过了在本地变量中使用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中失败了。我误读了你的代码片段吗?