JS はシングルスレッド言語です。この記事では主に JS のイベント ポーリング メカニズムについて説明します。
JSの実行メカニズム(1):
1. まず、JSが同期か非同期かを決定し、同期はイベントテーブルに入ります
2. 非同期タスクはイベントテーブルに関数を登録します。トリガー条件が満たされると、最後にイベント キューにプッシュされます
3. メイン スレッドに入った後、同期タスクが実行されます。メイン スレッドがアイドル状態になるまで、実行可能ファイルがあるかどうかを確認するためにイベント キューに移動します。非同期タスクがある場合はメインプロセスにプッシュされます
JSの実行メカニズム(2)
1. プロセス中にマイクロタスクが発生した場合、それを[イベントキュー]に入れます。マイクロタスク
2. 現在のマクロタスクの実行が完了したら、マイクロタスクの[イベントキュー]を確認し、その中のすべてのマイクロタスクを順番に実行します
タスク分割方法:
1.macro-task (マクロタスク): script, setTimeout, setInterval
2.micro-task(Microtask): Promise, process.nextTick
小さな疑問からスタート
for (var i=0;i<=5;i++){
setTimeout(()=>{console.log(i)},1000)
}
ログイン後にコピー
出力結果は、1sの後に6が連続して6つ出力されるはずです。この質問の主な知識ポイントはブロック レベルのスコープですが、イベント ポーリング メカニズムの導入に非常に適しています。 setTimeout は非同期タスクであるため、すべての同期タスクが実行されるまで待つ必要があります。つまり、i が 6 になると、同時に 6 つのタイマーの実行が開始されます。時間、i は 6. 変数のグローバル値を指しているので、6 を出力します。これは JS 実行メカニズム (1) です
さらに難しくするために、JS 実行メカニズム (2) を考慮してください
// promise里面的函数是立即执行的// 分别输出 2 3 5 4 1setTimeout(function () {
console.log(1)
},0);new Promise(function executor(resolve) {
console.log(2); for(var i=0;i<10000;i++){
i==9999 && resolve();
}
console.log(3);
}).then(function () {
console.log(4);
});
console.log(5);
ログイン後にコピー
最初のマクロ タスクが実行されましたはスクリプトである必要があるため、(実行を何秒遅らせても) タイマーがジャンプされ、Promise のコンテンツが順番に実行され、最初に 2 が出力され、次に for ループが実行されます。非同期コールバック関数。これは非同期実行に属します。同時に、タスク内にいる場合は、分割で述べたように、Promise はマイクロタスクであるため、マクロタスクの終了後にマイクロタスクのイベント キューがクリアされるため、3、5 になります。 、次に 4 が出力されます。
この時点で、最初のマクロタスクが処理され、次にタイマーの番になります。
以上がJSイベントポーリングメカニズムの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。