ホームページ ウェブフロントエンド jsチュートリアル 技術面接の質問 - イベント ループの一部

技術面接の質問 - イベント ループの一部

Nov 29, 2024 am 11:45 AM

導入

皆さん、こんにちは!

今日はタイトルにもあるように、イベントループについてお話します。

これは、面接官が直接尋ねることが多いトピックではありません (イベント ループの説明を求められたのは 2 回だけ覚えています)。しかし、ほとんどの面接では、それに関連した質問をされます。例:

  • 「これを行う場合…どのような動作をとるべきですか?」
  • 「コードが次のようになった場合、出力はどうなりますか?」
  • 「なぜこのコードはこの出力を生成するのですか?」

イベント ループがどのように機能するかを理解していれば、これらすべての質問に答えるのがはるかに簡単になります。

正直に言うと、このトピックは私の好みではありません。イベント ループがどのように動作するかを 10 分間続けて説明するよりも、コードの動作に関する質問の方が好きです。?

Technical Interview Questions - Part  Event Loop

さあ、飛び込みましょう! ?

## 質問
1. イベントループとは何ですか?
2. 例


イベントループとは何ですか?

短い答え:

イベント ループは、JavaScript ランタイムでの非同期タスクの処理を担当します。

正直に言うと、この答えはイベント ループについて尋ねるインタビュアーの好奇心を満たすのに十分ではないと思います。そこで今回の記事では、このテーマについてさらに深く掘り下げていきたいと思います。

単に概念を知るだけでなく、それがどのように機能するかを理解することが重要です。そのため、最後にいくつかの例を追加しました。

Technical Interview Questions - Part  Event Loop

理論

イベントループとは何ですか?

JavaScript にはイベント ループに基づくランタイムがあり、タスクの処理を担当します。各言語には独自のランタイムがあり、JavaScript はシングルスレッドであることに注意する必要があります。

シングルスレッドとはどういう意味ですか?

シングルスレッドとは、JavaScript が一度に 1 つのタスクのみを処理できることを意味します。これが、JavaScript においてイベント ループが非常に重要である理由です。このシングルスレッドの制限にもかかわらず、タスクを効率的に管理するのに役立ちます。

ランタイムのコンポーネント

イベント ループをより深く理解するために、まずその主要コンポーネントを見てみましょう:

Technical Interview Questions - Part  Event Loop

コールスタック

コールスタックは、呼び出す関数を追跡するデータ構造です。これはプレートのスタックのように考えることができます。関数が呼び出されるとスタックに追加され、関数が終了するとスタックから削除されます。

コール スタックは LIFO (後入れ先出し) 原則に基づいて動作します。つまり、JavaScript はスタックされた順序 (最上位の項目から下に 1 つずつ) で関数を実行します。 (JavaScript はシングルスレッドであることを思い出してください)。

キュー

JavaScript のランタイムには、処理されるタスクのリストを保持するキューがあります。これらのキュー内のタスクは、コール スタックが空になるまで待機します。

  • タスク キュー (またはコールバック キュー): このキューには、setTimeout() 呼び出しや setInterval() 呼び出しなどのタスクが保存されます。ここでのタスクは、コール スタックが空になり、マイクロタスク キュー内のすべてのタスクが処理された後に処理されます。 MDN のこのキューに保存されているタスクの例をさらにご覧ください。

  • マイクロタスク キュー: このキューはタスク キューよりも優先されます。これには、Promise コールバックなどのマイクロタスクや、process.nextTick() や async 関数などの非同期関数が含まれます。

タスク キューは、FIFO (先入れ先出し) ベースで動作します。つまり、タスクは追加された順序で処理されますが、それはマイクロタスクの後にのみ処理されます。キューは空です。

イベントループ

イベント ループは、非同期コードの実行を管理するメカニズムです。コール スタックを監視し、コール スタックとキュー (タスク キューとマイクロタスク キュー) の間を調整して、コードのスムーズな実行を維持します。

仕組みは?

イベント ループのプロセスを段階的に見てみましょう。視覚的に表現するには、下の画像を参照してください。

Technical Interview Questions - Part  Event Loop

この例では:

  • 呼び出しスタックには 1 つの関数があります。
  • マイクロタスク キューには 2 つのメッセージがあります。
  • タスクキューにはメッセージが 1 つあります。

ステップ 1: 呼び出しスタックを処理する

  1. イベント ループは、呼び出しスタックを確認することで開始されます。
  2. スタック内で関数を見つけて実行を開始します。
  3. この関数が完了すると、呼び出しスタックから削除されます。

Technical Interview Questions - Part  Event Loop

ステップ 2: マイクロタスク キューを処理する

  1. コールスタックが空になった後、イベントループはマイクロタスクキューをチェックします。
  2. マイクロタスク キューから最初のメッセージを取得し、実行のためにそれをコール スタックにプッシュします。

Technical Interview Questions - Part  Event Loop

  1. 関数が実行され、完了すると、呼び出しスタックから削除されます。
  2. その後、イベント ループは マイクロタスク キュー 内の次のメッセージに移動し、プロセスを繰り返します。
  3. これは、マイクロタスク キュー にメッセージがなくなるまで続きます。

Technical Interview Questions - Part  Event Loop

ステップ 3: タスクキューを処理する

  1. コールスタックマイクロタスクキューの両方が空になると、イベントループはタスクキューに変わります。
  2. タスクキュー内の最初のメッセージを選択し、それをコールスタックに追加します。
  3. 関数が実行され、完了すると、呼び出しスタックから削除されます。
  4. イベント ループは、タスク キュー 内の各タスクでこのプロセスを継続し、すべてのタスクが 1 つずつ処理されるようにします。

Technical Interview Questions - Part  Event Loop

この順序 (コール スタック、次に マイクロタスク キュー、最後に タスク キュー) に従うことで、イベント ループは JavaScript が非同期コードを効率的に処理できるようにします。シングルスレッド環境


イベント ループの仕組みとタスクの優先順位付け方法を理解したところで、いくつかの例を見てみましょう。

例1

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');
});
ログイン後にコピー
ログイン後にコピー
  • ここでは、コールバック関数を使用して新しい Promise を作成します。
  • この関数内では、console.log('A') がすぐに実行されるため、"A" がコンソールに出力されます。
  • 「A」を記録した後、Promise は値「B」で解決されます。
  • JavaScript は、メイン コール スタックがクリアされたら実行する必要がある .then コールバック (つまり、showB) があることを認識するため、showB を マイクロタスク キュー に追加します (Promise の解決がそこに送られるため)。

2. setTimeout 呼び出し

setTimeout(function showC() {
  console.log('C');
}, 0);
ログイン後にコピー
ログイン後にコピー
  • setTimeout 関数は、showC が 0 ミリ秒後に実行されるようにスケジュールします。
  • JavaScript は showC をタスク キューに配置します。これはタイマーベースの関数であるためです。

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();
ログイン後にコピー
ログイン後にコピー
  • この行は、前のステップ (resolve('B')) ですでに解決した Promise の .then ハンドラーを登録します。
  • Promise が解決されたため、showB (.then コールバック) が マイクロタスク キュー に追加されます。

4. d
の定義

const a = new Promise(function showA(resolve) {
  console.log('A');
  resolve('B');
});
ログイン後にコピー
ログイン後にコピー
  • この行は関数 showD を定義しているだけですが、まだ実行されていないため、ここでは何も起こりません。

5. d()
の呼び出し

setTimeout(function showC() {
  console.log('C');
}, 0);
ログイン後にコピー
ログイン後にコピー
  • ここで d() を呼び出します。これは 呼び出しスタック に追加されて実行されます。 これにより console.log('D') が生成されるため、"D" がコンソールに出力されます。

最終出力順序:

a.then(function showB(b) {
  console.log(b);
});
ログイン後にコピー

参考GIF

Technical Interview Questions - Part  Event Loop
インタラクティブな例

例 2

const d = function showD() {
  console.log('D');
};
ログイン後にコピー

もう一度、出力の順序について考えてみましょう。

✨それは何だと思いますか?✨

説明して​​いきましょう...

1.ロギング「スタート!」

d();
ログイン後にコピー
  • この行は 呼び出しスタック に追加され、すぐに実行されます。
  • その結果、「Start!」 がコンソールに出力されます。
  1. setTimeout 呼び出し
A
D
B
C
ログイン後にコピー
  • setTimeout 関数は、0 ミリ秒後に実行されるように showTimeout をスケジュールします。
  • JavaScript は、showTimeout を タスク キュー に配置します。これはタイマーベースの関数であるためです。

3.約束の解決

console.log("Start!");

setTimeout(function showTimeout() {
  console.log("Timeout!");
}, 0);

Promise.resolve("Promise!")
  .then(function showPromise(res) {
    console.log(res);
  });

console.log("End!");
ログイン後にコピー
  • Promise は値「Promise!」ですぐに解決されます。
  • JavaScript は showPromise (.then コールバック) を マイクロタスク キュー に配置します。これは、Promise は解決された後にマイクロタスク キューに入るからです。

4.ロギング「終了!」

console.log("Start!");
ログイン後にコピー
  • この行は 呼び出しスタック に追加され、すぐに実行されます。
  • その結果、「End!」 がコンソールに出力されます。

最終出力順序:

setTimeout(function showTimeout() {
  console.log("Timeout!");
}, 0);
ログイン後にコピー

参考GIF

Technical Interview Questions - Part  Event Loop
インタラクティブな例

終わり

この章はそれほど長くありませんでしたが、これらの例がイベント ループの仕組みを理解するのに役立つことを願っています。

他の例を分析するには、インタラクティブ ページを試してみることを強くお勧めします。このページを試してみると、実際のイベント ループをより簡単に理解できるようになります。

私の以前の投稿にたくさんの愛をいただき、本当にありがとうございます!

また来週お会いしましょう! ?

バイバイ

Technical Interview Questions - Part  Event Loop

以上が技術面接の質問 - イベント ループの一部の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Zustand非同期操作:UseStoreが取得した最新の状態を確保する方法は? Zustand非同期操作:UseStoreが取得した最新の状態を確保する方法は? Apr 04, 2025 pm 02:09 PM

Zustand非同期操作のデータの更新問題。 Zustand State Management Libraryを使用する場合、非同期操作を不当にするデータ更新の問題に遭遇することがよくあります。 �...

See all articles