次のコードを見てください:
var arr = [];
var cc = function(){alert('xx');};
for(var i = 0; i
arr[i ] = function(){alert('yy');}
arr[i 10] = cc;
}
console.group('start')
console.group( '1')
console.info( arr[0] == arr[1]);
console.info( arr[0] === arr[1]); >
console.info(arr[0].toString());
console.info(arr[1].toString());
console.groupEnd('1')
console.group('2')
console.info( arr[10] == arr[11]);
console.info( arr[10] === arr[11] );
console.info(arr[10].toString());
console.info(arr[11].toString()); console.groupEnd(' Start');
Firefox の Firebug でのコンソールの実行結果は次のとおりです:
分析:
コードの 5 行目のループが開始され、ループが終了すると、arr 配列の結果は次のようになります: arr[0] = function(){アラート('yy'); }
arr[1] = function(){ アラート('yy') }
arr[10] = cc
arr[11] = cc
として上に示すように、コンソールの結果が表示されます。
arr[0] は arr[1] と等しくありません。
しかし、arr[10] は以前に定義された変数を参照しているため、arr[11] と等しくなります。
実際、関数 function(){alert('yy');} はループ中に再定義されています。
arr[0] と arr[1] の toString 出力の内容は同じです。 ただし、2 つのメソッドは独立しており、独自のメモリを占有するため、メモリを節約するために、関数をループの外で定義できます。
ループの外で関数を定義するための前提条件は、関数がループ内で変更される変数を受け入れないことです。