0

私が行った場合:

setTimeout(function(){ alert('antani'); },400);
    setTimeout(function(){ alert('supercazzola'); },400);

このスクリプトがこれら 2 つのタイムアウトの間にキューを生成するのはなぜですか?

彼らは同時に警告すべきではありませんか?

試してみるとわかるように、最初に最初のアラートが実行され、次に 2 番目のアラートが実行されます。

4

2 に答える 2

1

読んでください: http://ejohn.org/blog/how-javascript-timers-work/

同様の例を次に示します。

function a(){
   var num = 5;
   console.log( ++num );
   setTimeout( a, 100 );
};
setTimeout(a,2000);

年代順に:

関数 a を呼び出さずに定義しています

a が 2 秒後に呼び出されるようにスケジュールしています: setTimeout(a,2000)

いわゆる

呼び出されると、100 ミリ秒後に呼び出しをスケジュールします。

コードは基本的に 2 秒間スリープし、100 ミリ秒の一時停止で実行します[*]。

ただし、コンテキストから判断すると、次の状況で何が優先されるかを尋ねています。

setTimeout(a, 2000);
setTimeout(b, 100);

おそらく、b が最初に呼び出されます (たとえば、全体的な OS パフォーマンスの問題が原因で、最初の行と 2 番目の行の間に予測できない一時停止がないと仮定します)。

同じタイムアウトを使用する場合:

setTimeout(a, 100);
setTimeout(b, 100);

a はおそらく最初に呼び出されます。ただし、これが保証されているとは思わず、JSエンジンに依存していると思います(今後のイベントに厳密なFIFOリストを使用するかどうか、内部クロックの解像度は何かなど)

于 2013-04-24T10:38:51.117 に答える
1

バックグラウンド

JavaScript には、インタープリターが実行されているスレッドが 1 つしかありません。つまり、イベントが同時に処理されることはありません。タイムアウトを設定すると、ブラウザーがアイドルモードになるたびに発生するブラウザーの内部イベントに実際にサブスクライブします (レンダリング、解析、またはスクリプトの実行などでビジーでない場合)。このイベントのハンドラとスケジュールされた時間はsetTimeout、スクリプトに表示された順序に従ってキューにポストされます。この内部イベントが発生するたびに、ブラウザーは各ハンドラーをチェックし、実行してキューから削除するか、スキップするかを決定します。

同時

同じ見積もり時間でタスクを次々とスケジュールする場合

setTimeout(function(){ $('.element').hide(); },400);
setTimeout(function(){ $('.element').show(); },400);

.element最初に非表示になり、次に表示されます。非表示にした後にブラウザが変更をレンダリングするという意味ではないことに注意してください.element。ほとんどのブラウザーは、スクリプトの実行が終了した後にのみレンダリングします。

別の時間

異なる見積もり時間でタスクをスケジュールする場合:

setTimeout(function(){ $('.element').hide(); },401);
setTimeout(function(){ $('.element').show(); },400);

結果は予測できない場合があります。次の場合が発生する可能性があります。

  • 400ミリ秒以上が401経過し、ブラウザーがイベント ハンドラーの処理を開始しています。この場合.element、最初に表示されてから非表示になります。setTimeoutミリ秒後に実行されるようにスケジュールされている他のが400あり、それらは hide の前に実行されることに注意してください.element

  • ブラウザは401、最初にイベント ハンドラの処理を開始する前にミリ秒以上ビジー状態でした。この場合、(ブラウザの実装に応じて).elementが最初に非表示になり、次に表示される可能性が最も高くなりますが、推定時間によってはその逆になるはずです!

あなたの質問に関して:同じ時間またはいくつかの正のデルタでタイムアウトを設定するのは同じですか?答えはNOです。同じではありません。デルタでタイムアウトを設定すると、それらの間で別のイベントまたはタイムアウトが処理される可能性が常にあります。

于 2013-04-24T11:15:47.243 に答える