このコードは、予想される 0 ~ 9 の代わりに 10 10 を出力します。これは、クロージャーに i への参照が含まれており、関数の実行時に i が 10 になっているためです
function f1(){ for(var i = 0; i < 10; i++) { setTimeout(function() { alert(i); }, 1000); } } f1();
上記の問題を解決するには、自己実行匿名関数を使用できます
function f2(){ for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { alert(e); }, 1000); })(i); } } f2();
ここの匿名関数は i をパラメータとして取り、ここの e は i のコピーを持ち、参照は e への参照であるため、上記の問題は回避されます