これはよくある概念上の間違いです。
- Javascriptはノンブロッキングです
- 実際の値ではなく、変数への参照が渡されます
x
変数は動的であることに注意する必要があります。への参照は、値x
ではなくに渡されalert("For loop iteration #" + x);
ます。したがって、alert
finallyが実行されると、が開始さx
れた時点ではなく、実行時点での値になります。setTimeout
基本的には次のようになります。
ループが処理され、6つのタイムアウトが作成され、その直後にが表示されますalert("Code to be executed after completed for loop");
。その後、しばらくするとタイムアウトが実行され、ループが終了した後の状態で変数xがすべて表示されます- 6
。
変数自体x
への参照ではなく、の値がアラートに渡されるように、クロージャが必要です。x
for (var x = 0; x <= 5; x++) {
(function(z) {
setTimeout(function() {
alert("For loop iteration #" + z);
}, 5 * z);
})(x);
}
編集:
2番目の問題に取り組むには、コールバック関数を使用する必要があります。CB関数はコードの論理的な継続ですが、すぐには実行されませんが、特定のポイント(最後のアラートが発生した)まで停止する必要があります。次のように実装します。
for (var x = 0; x <= 5; x++) {
(function(z) {
setTimeout(function() {
alert("For loop iteration #" + z);
if (z===5){ continue_code() }
}, 5 * z);
})(x);
}
function continue_code(){
alert("Code to be executed after completed for loop");
// Here comes all your code
// which has to wait for the timeouts from your for loop
}
最後のsetTimeoutで、コードの実行を継続する関数を呼び出します。