1

次のコードでは:

function doStuffA() {
 // DO SOME THINGS

 doStuffB();

 // DO SOME MORE THINGS
}
function doStuffB() {
// DO B THINGS
}
doStuffA();

コードはどのような順序で実行されますか?

それは...ですか:

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS

または:

1. DO SOME THINGS
2. DO B THINGS & DO SOME MORE THINGS - AT THE SAME TIME
4

3 に答える 3

5

での呼び出しと、どこかへdoStuffBの呼び出しがあることを意図していると仮定します...doStuffAdoStuffA

Javascriptは伝統的に同期的に実行されます。

したがって:

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS
于 2013-01-24T21:03:41.597 に答える
2

あなたの構文については多くの議論がありましたが、私はあなたが何を求めているのかを理解するのに十分なほど空白を埋めることができると思います。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が外部ソースを待機している間に実行を一時停止する唯一のケースです(私が間違っている場合は訂正してください)。

于 2013-01-24T21:58:24.230 に答える
-1

さて、あなたが電話したいと仮定してdoStuffA()...

    function doStuffA() {
     // DO SOME THINGS

     doStuffB();

     // DO SOME MORE THINGS
    }
    function doStuffB() {
    // DO B THINGS
    }

上記の結果になります

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS

非同期アプローチが必要な場合は、を使用しますsetTimeout()。ここにいくつかのドキュメントがあります:https ://developer.mozilla.org/en-US/docs/DOM/window.setTimeout

すなわち

    function doStuffA() {
     // DO SOME THINGS

       setTimeout(doStuffB,1);

     // DO SOME MORE THINGS
    }
    function doStuffB() {
    // DO B THINGS
    }
于 2013-01-24T21:09:48.037 に答える