//更新: この質問には参考価値がなく、少々頭を消耗するため、クローズを申請しました。詳細については、以下の私の回答を参照してください。
2 日前に言及されたブログを見ました: setInterval コールバック関数の実行時間が指定された遅延時間よりも大きい場合、タイマーがトリガーされたとき、タスク キューに同じタイマーのコールバック関数がある場合、これはcallback は無視されます。これは、タスク キュー内に同じタイマーに対する 2 つ以上のコールバック関数が存在しないことを意味します。ステートメントは不明瞭です。コードを見てください:例 1
setInterval は 100ms ごとにタスク キューに関数を追加し、setInterval は 1000ms 後にクリアされます。この結果を上記の文に従って説明してください:
リーリー
ブラウザは最初に for ループを実行しますが、私のコンピュータでは約 13 秒かかりました (コンピュータの調子が悪い...)。上記のステートメントによると、この 13 秒間、タスク内に存在するタイマーは 1 つだけです。 queue.関数を実行すると、実行結果は 13 秒後に 13 個の「タイマー」を同時に出力し、関数を 1 秒サイクルで実行します。###質問###
上の 2 つの例は矛盾しています。この場合、setInterval はどのように機能しますか?できれば信頼できる情報を添えて、明確な回答をいただければ幸いです。ありがとうダカール。
この質問をしましたが、今、少し混乱しているように感じます。 。 。
リーリー2 番目の例では、for ループの実行中に js スレッドが占有されており、次のステートメントが解析されていません。つまり、タイマーが登録されていません。例を変更して実行時間を追加します:
この例をテストに使用すると明らかになります。 上記の for ループは約 1544 ミリ秒実行されました。この時点で、js スレッドがステートメントを解析し、タイマーが登録され、その後通常どおり実行されました。
したがって、2 つの例の間に矛盾はありません。メインスレッドがタイマー関数を実行しており、タスクキューに同じタイマー関数がある場合、この期間中にすべてのタイマートリガーが発生します。
ただし、setInterval の例 2 は終了する前に実行されませんでした