11

次のコードがあるとします。

function testA {
   setTimeout('testB()', 1000);
   doLong();
}

function testB {
   doSomething();
}

function doLong() {
   //takes a few seconds to do something
}

私は実行しtestA()ます。Javascript はシングルスレッドであることを読みました。testB()タイムアウトに達すると、1000 ミリ秒後に何が起こりますか?

私が考えることができるいくつかの可能性:

  • testB()後に実行するためにキューに入れられ、doLong()それが呼び出した他のすべてが終了しました。
  • doLong()すぐに終了し、testB()開始されます。
  • doLong()停止する前に (自動的に、またはユーザーにプロンプ​​トを出してから) 実行するのに少し時間がかかり、testB()開始されます。
  • doLong()一時停止、testB()開始されます。終了後testB()doLong()再開します。

正解は?実装依存ですか、それとも標準の一部ですか?*

この質問は似ていますが、私が知る限り同じではありません。

Javascript の実行をよりよく理解するためにお勧めできるリンクを教えていただければ幸いです。

ありがとう!

*はい、すべてのブラウザーが標準に準拠しているわけではないことは承知しています :(

4

1 に答える 1

11

あなたの最初の推測は正しいものです: testB() is queued up to execute after doLong() and anything else it called have finished.

testA完了するまでに 1 秒以上かかる場合は、そのままtestB待つ必要があります。

setTimeout(testB, 1000)また、ではなく書くべきですsetTimeout('testB()', 1000)。文字列を setTimeout に送信することは、 を使用する場合と同様evalに、一般的に悪と見なされ、敵になります ;)

于 2011-02-01T09:51:44.493 に答える