0

IE8で無限ループを引き起こす次のループが混乱しています

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

this.theArrayIE8 は無限ループに陥りますが、これはグローバル配列で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

私がこれを読んだ方法は、無限ループに入るはずです。配列を列挙し、同時に項目を追加しています。つまり、次のようになります。

インデックス i を読み取り、i+1 を作成し、繰り返します。

他の言語は、列挙しているコレクションを変更しているときに爆発し、エラーの兆候を示します。

IE8でしか失敗しないことに驚いています。コードスニペットを読み間違えていますか?

于 2012-05-03T08:20:34.380 に答える