ホームページ >ウェブフロントエンド >jsチュートリアル >技術面接の質問 - イベント ループの一部
皆さん、こんにちは!
今日はタイトルにもあるように、イベントループについてお話します。
これは、面接官が直接尋ねることが多いトピックではありません (イベント ループの説明を求められたのは 2 回だけ覚えています)。しかし、ほとんどの面接では、それに関連した質問をされます。例:
イベント ループがどのように機能するかを理解していれば、これらすべての質問に答えるのがはるかに簡単になります。
正直に言うと、このトピックは私の好みではありません。イベント ループがどのように動作するかを 10 分間続けて説明するよりも、コードの動作に関する質問の方が好きです。?
さあ、飛び込みましょう! ?
## 質問
1. イベントループとは何ですか?
2. 例
短い答え:
イベント ループは、JavaScript ランタイムでの非同期タスクの処理を担当します。
正直に言うと、この答えはイベント ループについて尋ねるインタビュアーの好奇心を満たすのに十分ではないと思います。そこで今回の記事では、このテーマについてさらに深く掘り下げていきたいと思います。
単に概念を知るだけでなく、それがどのように機能するかを理解することが重要です。そのため、最後にいくつかの例を追加しました。
JavaScript にはイベント ループに基づくランタイムがあり、タスクの処理を担当します。各言語には独自のランタイムがあり、JavaScript はシングルスレッドであることに注意する必要があります。
シングルスレッドとは、JavaScript が一度に 1 つのタスクのみを処理できることを意味します。これが、JavaScript においてイベント ループが非常に重要である理由です。このシングルスレッドの制限にもかかわらず、タスクを効率的に管理するのに役立ちます。
イベント ループをより深く理解するために、まずその主要コンポーネントを見てみましょう:
コールスタックは、呼び出す関数を追跡するデータ構造です。これはプレートのスタックのように考えることができます。関数が呼び出されるとスタックに追加され、関数が終了するとスタックから削除されます。
コール スタックは LIFO (後入れ先出し) 原則に基づいて動作します。つまり、JavaScript はスタックされた順序 (最上位の項目から下に 1 つずつ) で関数を実行します。 (JavaScript はシングルスレッドであることを思い出してください)。
JavaScript のランタイムには、処理されるタスクのリストを保持するキューがあります。これらのキュー内のタスクは、コール スタックが空になるまで待機します。
タスク キュー (またはコールバック キュー): このキューには、setTimeout() 呼び出しや setInterval() 呼び出しなどのタスクが保存されます。ここでのタスクは、コール スタックが空になり、マイクロタスク キュー内のすべてのタスクが処理された後に処理されます。 MDN のこのキューに保存されているタスクの例をさらにご覧ください。
マイクロタスク キュー: このキューはタスク キューよりも優先されます。これには、Promise コールバックなどのマイクロタスクや、process.nextTick() や async 関数などの非同期関数が含まれます。
タスク キューは、FIFO (先入れ先出し) ベースで動作します。つまり、タスクは追加された順序で処理されますが、それはマイクロタスクの後にのみ処理されます。キューは空です。
イベント ループは、非同期コードの実行を管理するメカニズムです。コール スタックを監視し、コール スタックとキュー (タスク キューとマイクロタスク キュー) の間を調整して、コードのスムーズな実行を維持します。
イベント ループのプロセスを段階的に見てみましょう。視覚的に表現するには、下の画像を参照してください。
この例では:
この順序 (コール スタック、次に マイクロタスク キュー、最後に タスク キュー) に従うことで、イベント ループは JavaScript が非同期コードを効率的に処理できるようにします。シングルスレッド環境
イベント ループの仕組みとタスクの優先順位付け方法を理解したところで、いくつかの例を見てみましょう。
const a = new Promise(function showA(resolve){ console.log('A'); resolve('B'); }); setTimeout(function showC() { console.log('C'); }, 0); a.then(function showB(b) { console.log(b); }); const d = function showD() { console.log('D'); }; d();
続行する前に、出力の順序について考えてみてください。
✨それは何だと思いますか?✨
この出力が得られる理由を理解するために、コードの各部分を分析してみましょう。
1.プロミスの作成
const a = new Promise(function showA(resolve) { console.log('A'); resolve('B'); });
2. setTimeout 呼び出し
setTimeout(function showC() { console.log('C'); }, 0);
3. a.then コールバック
const a = new Promise(function showA(resolve){ console.log('A'); resolve('B'); }); setTimeout(function showC() { console.log('C'); }, 0); a.then(function showB(b) { console.log(b); }); const d = function showD() { console.log('D'); }; d();
4. d
の定義
const a = new Promise(function showA(resolve) { console.log('A'); resolve('B'); });
5. d()
の呼び出し
setTimeout(function showC() { console.log('C'); }, 0);
最終出力順序:
a.then(function showB(b) { console.log(b); });
参考GIF
インタラクティブな例
const d = function showD() { console.log('D'); };
もう一度、出力の順序について考えてみましょう。
✨それは何だと思いますか?✨
説明していきましょう...
1.ロギング「スタート!」
d();
A D B C
3.約束の解決
console.log("Start!"); setTimeout(function showTimeout() { console.log("Timeout!"); }, 0); Promise.resolve("Promise!") .then(function showPromise(res) { console.log(res); }); console.log("End!");
4.ロギング「終了!」
console.log("Start!");
最終出力順序:
setTimeout(function showTimeout() { console.log("Timeout!"); }, 0);
参考GIF
インタラクティブな例
この章はそれほど長くありませんでしたが、これらの例がイベント ループの仕組みを理解するのに役立つことを願っています。
他の例を分析するには、インタラクティブ ページを試してみることを強くお勧めします。このページを試してみると、実際のイベント ループをより簡単に理解できるようになります。
私の以前の投稿にたくさんの愛をいただき、本当にありがとうございます!
また来週お会いしましょう! ?
バイバイ
以上が技術面接の質問 - イベント ループの一部の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。