2011-02-01 19 views
10

は、私は次のコードを持っていると言います。私はJavascriptがシングルスレッドであることを読んだ。 testB()のタイムアウトに達すると、1000ミリ秒後に何が起こりますか?Javascriptの実行順序は、()

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

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

正解とは何ですか?実装に依存しているのか標準の一部ですか*

This questionは同じですが、私が知る限りは同じではありません。

Javascriptの実行をよりよく理解するために推奨できるリンクがあれば幸いです。

ありがとうございます!

*はい、私はありませんすべてのブラウザが標準に従っていることを知っている:(

答えて

10

あなたの推測の最初が正しいものである: 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を使用して同じように、generally considered evilであり、あなたを行います

+0

私は 'setTimeout(function(){testB(); }、1000); '私は嘘をついた? –

+2

@ Shadow Wizard:はい、かなり間違っています。私の知る限りあなたの方法と私の間には違いはありません(ただし、私のほうが短いです:D)。説明するために、あなたの式を変数に引っ張った場合を想像してみましょう: 'var f = function(){testB(); }; setTimeout(f、1000); '。それでも同じ意味ですが、今は冗長性を見ることができます。 – Jakob

+1

文字列ではなくsetTimeoutに関数を渡すことについての回答とアドバイスの両方をお寄せいただきありがとうございます。私が読んできたチュートリアルがちょっと疑わしいですね;) –