i
このループは関数内にあり、10からカウントダウンしますが、関数で使用して渡されたパラメーターにアラートを送信するsetV
と、実際にカウントアップします。
for (var i=10;i>0;i--){
setTimeout('setV('+i+',"Out")',100);
}
function setV(c,t){
alert(c);
}
i
このループは関数内にあり、10からカウントダウンしますが、関数で使用して渡されたパラメーターにアラートを送信するsetV
と、実際にカウントアップします。
for (var i=10;i>0;i--){
setTimeout('setV('+i+',"Out")',100);
}
function setV(c,t){
alert(c);
}
すべてのsetVは同時に実行するようにプログラムされており(瞬時ループ実行の100ms後)、順序は決定されません(仕様を参照)。
あなたはおそらく欲しかった
for (var i=10;i>0;i--){
setTimeout('setV('+i+',"Out")',100*(11-i));
}
すべてのタイムアウトが同時に実行されるように設定されている場合、これを実行する順序は保証されません。
これは、そのループを作成するためのはるかに優れた方法です。
function initThis() {
var idx = 0;
function doOneIteration() {
window.alert(idx);
idx++;
if (idx <= 10) {
window.setTimeout(doOneIteration);
}
}
doOneIteration(); // Start loop
}
initThis(); // This makes it all happen
動作を次のように説明している場合:
setTimeout('setV('+i+',"Out")',i*100);
カウントアップする理由は、1秒のコールバックセットが2秒の1セットよりも早く実行され、3秒の1セットよりも早く実行されるためです。