それでは、この setTimeout の全体を 0ms で分解してみましょう。一見すると、「0ms ということは、すぐに実行されるということですよね?」と思うかもしれません。しかし、JavaScript には独自の雰囲気があり、0 ミリ秒は期待するほど瞬時ではありません。これを一緒に考えてみましょう。
これが私たちが分析しているコードです:
const promise = new Promise((resolve, reject) => { console.log(1); setTimeout(() => { console.log("timerStart"); resolve("success"); console.log("timerEnd"); }, 0); console.log(2); }); promise.then((res) => { console.log(res); }) console.log(4);
そして出力は?
1 2 4 timerStart success timerEnd
setTimeout(() => { ... }, 0) を見ると、内部のコードが 0 ミリ秒後のすぐに実行されるように感じられます。しかし、そうではありません。JavaScript は、「兄弟、私は独自のシステムを持っています。順番を待ってください!」のようなものです。
JavaScript はコードを直接実行するだけではなく、タスクを処理するための イベント ループ と呼ばれる優れたシステムを備えています。次のように考えてください:
メインタスク (同期):
console.log() のようなものが最初に実行されます。これらは直接的な、目の前にあるタスクです。
マイクロタスク (約束):
たとえタイマーの前であっても、約束は次に来るものです。まるでVIPチケットを手に入れたようだ。
タスクキュー (setTimeout などのタイマー):
タイマーはラインの最後尾に置かれ、マイクロタスクが完了した後にのみ実行されます。 0msを与えても待機します。
何が起こっているのかを段階的に見てみましょう:
作成された約束:
Promise .then():
console.log(4):
マイクロタスクの実行 (VIP):
タスクキューの実行:
0ms と言っているにもかかわらず、setTimeout は常に延期されます。 JavaScript は、何があってもそれを タスクキュー にプッシュします。システムは、タスク キューにアクセスする前に、まずすべての同期タスクとマイクロタスク (Promise) をクリアします。
簡単に言うと、
0 ミリ秒は時間のことではありません。順番を待っているのことです。
ジェットコースターの列に並んでいると想像してください:
コード内のイベントの順序は次のとおりです:
0ms が実際にどのように機能するかを理解すると、より良い非同期コードを作成するのに役立ちます。これは、JavaScript のランダムな遅延をデバッグしている友人に説明するための素晴らしいトリックでもあります。
次に setTimeout(() => { ... }, 0) を見たときは、時間の問題ではないことを覚えておいてください。 優先についてです!
以上がJavaScript における setTimeout(..., ) の実際の意味は何ですか? (イベントループの説明!)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。