0

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

4

3 回答 3

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,.....]
    }
}
于 2012-05-03T08:12:48.070 回答
0

你应该尝试self而不是this

self是脚本运行的窗口或框架,所以它就像访问全局变量一样。

for (var i in theArray) {
    self.theArray.push(theArray[i]);
}

如果这没有帮助,请为数组指定不同的变量名称。

或者:您确定这theArray是本地范围吗?var在定义 `theArray ?

var theArray
于 2012-05-03T08:09:16.850 回答
0

我读这个的方式,它应该进入一个无限循环。您正在枚举一个数组并同时向其中添加项目,即:

读取索引 i,创建 i+1,重复。

当您修改您正在枚举的集合时,其他语言会爆炸,这会给您一个错误指示。

我很惊讶它只在 IE8 中失败。我误读了您的代码片段吗?

于 2012-05-03T08:20:34.380 回答