あなたの構文については多くの議論がありましたが、私はあなたが何を求めているのかを理解するのに十分なほど空白を埋めることができると思います。JavaScriptが順番に実行されるかどうかを知りたい。具体的には、関数呼び出しが、呼び出された関数が終了するまで呼び出し元の関数の実行を一時停止する場合。
一般的なケース
一般的なケースでは、答えはイエスです。これを説明するためのサンプルコードを次に示します。
var count = 0;
var result = "";
function a() {
result += "first part of A. \n";
b();
result += "last part of A. ";
}
function b() {
for (var i = 0; i < 100000; i++) {
count++;
}
result += "even after " + count + " cycles, A waits for B. \n";
}
a();
console.log(result);
jsFiddleで実行可能なバージョン:http://jsfiddle.net/jmorgan123/574Rh/
やってみよう。結果は次のようになります。
first part of A.
even after 100000 cycles, A waits for B.
last part of A.
ルールの例外
これには例外があり、それらは非常に重要です。間隔またはタイムアウトを設定すると、プログラムはタイマーを開始し、タイマーが終了すると関数を実行するように計画します。しかし、それが起こるのを待つことはありません。タイマーが開始されると、プログラムの残りの部分は他のタスクを続行します。
//won't do what you want:
result += "first part of A ";
setInterval(b, 1000);
result += "last part of A ";
この場合、a()
実行が終了すると、次のresult
ようになります。
first part of A, last part of A
実際、console.log(result)
実行される前に実行されるため、表示されるのb()
はそれだけです。
JSが実行を延期するもう1つの重要なケースは、AJAX呼び出しです。これはいつも人々をつまずかせます。この間違いの例を次に示します。
//also won't do what you want:
result += "first part of A ";
$.get('ajax/test.html', function(data) {
result += "now with AJAX! ";
});
result += "last part of A ";
繰り返しますが、結果は実行first part of A, last part of A
時になりconsole.log(result)
ます。AJAX呼び出しの後にコードが実行されることを保証する唯一の方法は、コードをコールバックに入れることです。
var result = "";
function a() {
result += "first part of A ";
$.get('ajax/test.html', function(data) {
result += "now with AJAX! ";
result += "last part of A ";
console.log(result);
});
}
a();
alert()
とconfirm()
最後の注意点:興味深いことに、関数alert()
とconfirm()
は実際には制御フローを中断します。コードが次のようになっている場合:
result += "first part of A, ";
result += confirm("what is your choice?"); //let's assume you click 'OK' here
result += ", last part of A";
... first part of A, true, last part of A
[OK]をクリックするのをどれだけ待っても、結果は変わりません。confirm
そしてalert
、JavaScriptが外部ソースを待機している間に実行を一時停止する唯一のケースです(私が間違っている場合は訂正してください)。