function box(){ var arr = []; for(var i=0;i<5;i++){ arr[i]=function(){ return i; } } return arr; } var b = box(); console.log(b.length); for(var i=0;i<b.length;i++){ console.log(b[i]()) }
上記のコードは 5 5 を出力します
b[i]() は匿名関数を呼び出しますが、匿名関数自体は実行されないため、呼び出された時点で box() はすでに実行されています。 。 。 。
以下を変更します:
function box(){ var arr = []; for(var i=0;i<5;i++){ arr[i]=( function(num){ console.log("ccc="+num) return num; } )(i) } return arr; } var b = box(); console.log(b.length); for(var i=0;i<b.length;i++){ console.log(b[i]) }
実行結果:
num=0 num=1 num=2 num=3 num=4 5 0 1 2 3 4
変更後、匿名関数はそれ自体の実行を許可され、最終的な b[i] は関数の代わりに配列を返します