var funcs = [[],[],[],[]]; for(var i=0;i<3;i++){ // グローバルのiを参照 funcs[0].push(function(){return i;}); // function内のxを参照 funcs[1].push((function(){ var x = i; return function(){return x;}; })()); // function内のiを参照(引数で渡す) funcs[2].push((function(i){ return function(){return i;}; })(i)); // with()内のオブジェクトのプロパティiの値を参照 with({i:i}){ funcs[3].push(function(){return i;}); } } //結果出力:Firebugで。 for(var i=0;i<4;i++){ console.log(i+":"+funcs[i][1]()); }
結果:
0:0 1:1 2:1 3:1
0番目は失敗例として、
1,2,3の方法でiの値を閉じ込めることができる。
変数のスコープはfunction内で、with内も似たようなことになる、と覚えておけばいいわけすね。
0番目の場合は一番外側の領域内でiの値を探しにいくので、その実行時のiの値0が使われた、と処理されたとみればいいんすね。