イベントループ
JavaScriptは単一のThread言語です->1つのcallスタックしか存在しません->一度に一つだけ処理する
しかし、JavaScriptで実現されたWebは、同時に処理されていることは明らかです.→rightarrow→イベントループ.イベントループはJavaScriptエンジンではなく、ブラウザまたはノードにあります.jsで処理します.
JavaScriptエンジンは、JavaScriptコードを実行するプログラムまたは仲介プログラムです.典型的な例はGoogle V 8エンジンです.(Chrome、Node.jsで使用)
HTML解析器は、HTMLソースで javascriptソースコードがパケット化されます.→rightarrow→ノードを作成します. データを使用してAST(抽象構文ツリー) を作成 ASTは、小さなプログラムによってバイトコード(仮想マシンで理解可能) に変更された.最適化共通構文コンパイル→rightArrow→最適化コードタッチ ASTを使用してバイトコード→rightArrow→共通構文を最適化コードを生成し、これら2つの構文をCPU に正しく渡す.
ソース
実行順序を記憶する資料構造.関数を実行するには、スタックに関数を入れ、実行が完了したらスタックから削除します.
JavaScriptランタイム環境で処理するコマンドを一時的に格納するキューで、非同期実行のコールバック関数を格納します.
コールバックキューは1つしかないように見えますが、実際には複数から構成されています.タスクキュー:settimout、setInterval、setImmediate、RequestAnimationFrame、I/O、UIレンダリングなどがコールバック関数として追加されます. Microtask Queue: process, nextTick, Promise, Object.observe, MutationObserver アニメーションフレーム:
Microtask Queue < Animation Frames < Task Queue
サンプルコードの表示
まず、呼スタック
ここで
これでスタックが空になり、webapiの
問題が発生した場合はsettimeout 0で解決します.これは無意味な行為のようですが、スタックを待機させるためです.(スタックが空の場合のみイベントループを入れる)
しかし,複数のsettimeoutが蓄積されると,技術キューに待機が蓄積されるため,正確な時間は保証されない.逆に、最も短い遅延時間しか指定できません.
AJAXリクエストも、Javascript実行時ではなくブラウザwebapi上で実行されます.ここで実行すると、JSエンジンの呼び出しスタックで他のコードを正常に実行できます.
2配列とコールバックを受信し、各要素でsettimeoutを0で実行
では、撮影コンソールでtimerやapiを呼び出して無限に撮影コンソールを呼び出すとapiは実行できませんか?
5000回目はこのように過ぎて、話もできません.
10万回ものあいさつを聞いて、たった一言の様子だった.
結論:リミットレス回転中にパソコンが爆発して確認できなかったのですが、最後まで押すと、運転できなくなったようです.
リファレンスイメージ
非同期。
しかし、JavaScriptで実現されたWebは、同時に処理されていることは明らかです.→rightarrow→イベントループ.イベントループはJavaScriptエンジンではなく、ブラウザまたはノードにあります.jsで処理します.
JavaScriptエンジン
JavaScriptエンジンは、JavaScriptコードを実行するプログラムまたは仲介プログラムです.典型的な例はGoogle V 8エンジンです.(Chrome、Node.jsで使用)
JavaScriptエンジン動作
<Script>
タグに遭遇します.じっこうじかん
ソース
コールスタック
実行順序を記憶する資料構造.関数を実行するには、スタックに関数を入れ、実行が完了したらスタックから削除します.
コールバックキュー
JavaScriptランタイム環境で処理するコマンドを一時的に格納するキューで、非同期実行のコールバック関数を格納します.
コールバックキューは1つしかないように見えますが、実際には複数から構成されています.
コールバックキュー優先度
Microtask Queue < Animation Frames < Task Queue
実行例
サンプルコードの表示
console.log('hi');
setTimeout(function(){
console.log('there');
},5000);
console.log('JSConfEU');
この操作を行うと、hi→右矢印→there→右矢印→(5秒後)JSCOFEUが出力します.まず、呼スタック
console.log('hi')
に入り、次いでsetTimeout
に入り、次いでconsole.log('JSConfEU')
になる.ここで
setTimeout
は、ブラウザが提供するAPIである.(javascriptを実行するランタイム環境に存在する独立したAPI)ブラウザにおける数setTimeout
の5秒.これは、setTimeout
の呼び出し自体が完了したことを意味し、スタックから関数を削除することができます.それでは最後に残りのconsole.log('JSConfEU')
は運行終了です.これでスタックが空になり、webapiの
setTimeout
しか残っていません.Webapiでタイマの実行が完了したら、テクノロジーキューにプッシュします.活動サイクルは簡単なことをします.ロールは、コールスタックとテクノロジーキューに注目します.callスタックが空の場合、テクノロジーキューの最初のcallbackスタックをスタックで実行できます.スタック実行および削除関数.追加)
問題が発生した場合はsettimeout 0で解決します.これは無意味な行為のようですが、スタックを待機させるためです.(スタックが空の場合のみイベントループを入れる)
しかし,複数のsettimeoutが蓄積されると,技術キューに待機が蓄積されるため,正確な時間は保証されない.逆に、最も短い遅延時間しか指定できません.
AJAXリクエストも、Javascript実行時ではなくブラウザwebapi上で実行されます.ここで実行すると、JSエンジンの呼び出しスタックで他のコードを正常に実行できます.
[1,2,3,4].forEach(function(i){ //---1번
console.log(i);
});
function asyncForEach(array,cb){ //----2번
array.forEach(function(){
setTimeout(cb,0);
})
}
asyncForEach([1,2,3,4], function(i){
console.log(i);
})
1独自のスタックで実行2配列とコールバックを受信し、各要素でsettimeoutを0で実行
じっけん
では、撮影コンソールでtimerやapiを呼び出して無限に撮影コンソールを呼び出すとapiは実行できませんか?
for (let i = 0; i < 100000; i++) {
console.log("안녕?");
if (i === 5000) {
setTimeout(function () {
console.log("나도 말 좀하자");
}, 1000);
}
}
コードを簡単に記述して実験を行った.5000回目はこのように過ぎて、話もできません.
10万回ものあいさつを聞いて、たった一言の様子だった.
結論:リミットレス回転中にパソコンが爆発して確認できなかったのですが、最後まで押すと、運転できなくなったようです.
リファレンスイメージ
Reference
この問題について(イベントループ), 我々は、より多くの情報をここで見つけました https://velog.io/@doctor/이벤트-루프-Event-Loopテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol