今回は、シングルスレッド JS とマルチスレッド ブラウザーの使用について説明します。シングルスレッド JS とマルチスレッド ブラウザーを使用する際の 注意事項 は何ですか?実際のケースを見てみましょう。
JS 言語はシングルスレッドです。ブラウザはタスク (関数) を実行するために 1 つのメイン スレッドのみを js に割り当てますが、これらのタスクは一度に 1 つだけ実行でき、タスク キューを形成し、実行のためにキューに入れられます。
ブラウザはマルチスレッドです
ネットワークリクエスト、
タイマー、イベントモニタリングなどの一部のフロントエンドタスクは、他のタスクと同様にキューに入れられて実行を待機している場合、実行効率が低下します。非常に低くなり、ページがフリーズする場合もあります。したがって、ブラウザは Webkit や Gecko エンジンなどのマルチスレッドであり、次のスレッドを持つ可能性があります:
javascriptエンジンスレッド
httpリクエストスレッド
インターフェースレンダリングスレッド
ブラウザイベントトリガースレッド
JS単一スレッドとAjaxは非同期です
JSはシングルスレッドで動作するとのことですが、なぜ接続後はXMLHttpRequestが非同期なのでしょうか?これは、新しいスレッドを開くためにブラウザによって要求されます。リクエストされたステータスが変更されると、コールバックが事前に設定されている場合、非同期スレッドはステータス変更イベントを生成し、それを JavaScript エンジンの
イベント処理キューに入れて処理を待ちます。デキュータスクはブラウザがアイドル状態のときに処理され、JavaScript エンジンは常にシングルスレッドのコールバック関数を実行します。実際、JavaScript エンジンはシングルスレッドのタスク キューであり、通常の関数とコールバック関数で構成されるキューであると理解できます。 つまり、Ajax リクエストは確かに非同期です。これはブラウザによって開かれた新しいスレッド リクエストであり、イベントがコールバックされると、イベント ループのシングルスレッド イベント キューに入れられて処理を待ちます。
JSのイベントループの仕組み(イベントループ)
JavaScriptにはメインスレッドのメインプロセスとコールスタック(コールスタック)があり、コールスタック内のタスクを処理するとき、他のものはすべて待機する必要があります。実行中に setTimeout などの非同期操作が発生すると、setTimeout で指定された遅延実行時間に達すると、それらの操作はブラウザーの他のモジュール (Webkit を例として、Webcore モジュール) に引き渡されて処理されます。 (コールバック関数) がタスクキューに入れられます。一般に、異なる非同期タスクのコールバック関数は異なるタスク キューに配置されます。コールスタック内のすべてのタスクが実行されるまで待ってから、タスクキュー内のタスク(コールバック関数)を実行します。
上の図では、DOM 操作、ajax リクエスト、setTimeout、その他の WebAPI がコール スタックで発生すると、それらは処理のためにブラウザ カーネルの他のモジュールに渡されます。Webkit カーネルには Javasctipt 以外にも重要なモジュールがあります。実行エンジンはWebコアモジュールです。図の WebAPI で示されている 3 つの API について、Webcore は、基礎となる実装を処理するために、それぞれ DOM バインディング、ネットワーク、およびタイマー モジュールを提供します。これらのモジュールがこれらの操作の処理を完了したら、コールバック関数をタスク キューに入れ、スタック内のタスクが実行されるのを待ってから、タスク キュー内のコールバック関数を実行します。
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
jsの型変換に関するいくつかのマイナーな問題
JSの暗黙的な型変換
以上がシングルスレッド JS とマルチスレッド ブラウザの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。