0

次のコードを使用して、特定の要素を囲む 2 次元配列の要素をインクリメントしています。

 EmptyCell = {number: 0}; //This has several parts in the actual code.
 list = new Array();

function init(w,h){
    for (var x = 0; x <= w; x++){
        list[x] = new Array();
        for (var y = 0 ; y <= h; y++){
            list[x][y] = EmptyCell;
        }
    }
}

function map(func,x,y){
    var xoff = [1,1,1,0,0,-1,-1,-1];
    var yoff = [1,0,-1,1,-1,1,0,-1];
    for (var atIndex = 0; atIndex < 8; atIndex++){
        func(x+xoff[atIndex],y+yoff[atIndex]);
    }
}

そして、次のように実行します。

init(10,10);

map(function(x,y){
    if (list[x] != null && list[x][y] != null){
        list[x][y].number++;
    }
},0,0);

が実行されるたびlist[x][y].number++に、配列全体のすべての要素がインクリメントされます。誰かがなぜこれが起こっているのか説明できますか?

4

1 に答える 1

10

EmptyCellはオブジェクトなので、すべての要素が同じオブジェクトを参照します。要素ごとに個別のオブジェクトを使用する場合は、毎回新しいインスタンスを作成します。

于 2009-10-26T23:20:42.347 に答える