4

ブラウザで実行する場合setTimeout、メイン プログラムの実行が完了する前にそのコードを実行することはありますか? 主要なブラウザー ベンダーはこの動作に同意していますか?それとも実装の副作用ですか? (または、この副作用を標準的な動作として保持することに同意したか)

非常に単純な (そして役に立たない) プログラムを考えてみましょう。

setTimeout(function(){
    console.log("Timeout Called")
},1);
for(var i=0;i<10000000;i++){};
console.log("done");

最初に、コンソールに出力する単一のマイクロ秒のsetTimeoutコールバック関数を設定します。Timeout Called

次に、1 マイクロ秒以上ループしてスピンします。

次にdone、コンソールに出力します。

このプログラムを実行すると、常に出力されます

done
Timeout Called

つまりsetTimeout、メイン プログラムが実行されるまで、コールバック関数は考慮されません。

これは信頼できる定義済みの動作ですか? または、メイン プログラムの実行が停止し、コールバックが実行され、メイン プログラムの実行が継続される場合があります。

4

3 に答える 3

3

はい、それは定義された動作です。Ajax コールバックが、おそらく現在の実行パスが終了する前に、ある時点で非決定論的に実行されるというのはよくある誤解ですが、実際には、実際には常に後で実行されます。

Javascript はシングル スレッドであり、現在のスレッドの実行が完全に終了するまでイベント ループに戻ることはありません。

イベント ハンドラー (Ajax を含む) などの非同期関数や、setInterval/setTimeout でスケジュールされた関数は、現在の実行パスが完了するまで実行されません。

于 2013-08-22T19:08:53.413 に答える
2

これは非常に明確に定義された動作です。

ブラウザは非同期ではなく、次のアクションを実行する前に前のアクションが完了するまで待機する必要があります

于 2013-08-22T19:09:01.513 に答える
1

を使用するtimeOutと、最初に渡されたミリ秒数だけ待機し、コードに空きができるまで待機し続けます。通常、これはコードが完了するまで待機することを意味します。唯一の例外 (一種) は、他timeOutの やを使用する場合setIntervalです。たとえば、ループが

for(var i=0;i<10000000;i++){
    setTimeout(function () {
        console.log('One iteration');
    }, 15);

};

あなたの出力は

done
Timeout Called
One iteration
One iteration

等々。

于 2013-08-22T19:16:33.857 に答える