Javascriptでタイマーがどのように機能するかよくわかりません。JS はシングル スレッドであるため、コードが実行され、たとえばユーザーがボタンをクリックすると、クリックがキューに追加されます。キューは空だったので、キューは次のようになります。
[クリック]
現在実行中のコードが終了するとすぐに実行されますよね?同じコードがまだ実行されていて、まだ完了していないとしましょうsetTimeout(fn,3000)
。
今、私はこれが正しいかどうかわかりません。これfn
はキューに追加されませんが、この瞬間から 3000 ミリ秒近くの時点で発火します (このコードの実行が終了した時点からではありません)。この時点で、そのイベントが発生する必要がある場合 (今から約 3000 ミリ秒後) 他のコードが実行されている場合 (上記の [クリック] など)、これfn
はキューの最後に配置されます。
元の実行中のコードに戻ると、[クリック] はキューにあり、コードはさらに実行されます。実行中のコードは、DOM の一部の要素のスタイル プロパティを変更し、境界線を追加します。この変更は、ブラウザが UI を更新するときに行う必要があります。JS が他のコードを実行しているため、すぐには表示されず、クリック後に追加されるため、キューは次のようになります。
[クリック] [UI の更新 - 境界線が変更される可能性があります]
そのため、キューには、現在実行中の JS が終了したときに呼び出される 2 つのイベントが含まれています。[クリック] が呼び出されますが、以前のコードで要求された境界線の変更はユーザーには表示されません。クリックが完了すると、UI の更新であるキューからの次のイベントがジャンプします。以前のコードを実行したときに要求した境界線の変更を含め、おそらくたくさんの描画が行われるでしょう。
クリック イベントが実行されている間、または UI が表示に変更を加えて画面を再描画しているときに、スケジュールしたタイマーが起動fn
し、キューに追加され、できるだけ早く実行されます。
私の理解は正しいですか?私が何かを誤解したかどうかを誰かが明確にし、どこが間違っているかを説明できれば、それは素晴らしいことです. これを明確にしたら、この質問をsetTimeout(fn,0)
トリックに拡張します。これは、実際に私をさらに混乱させるものです。