13

次の図は、Jon Resig著『 Secrets of the JavaScript Ninja』の第 3 章からの引用です。ここでは、著者がブラウザのイベント ループについて説明しています。

ここに画像の説明を入力

本はこう言わなければならない:

イベントをキューに入れるブラウザ メカニズムは、このイベント ループ モデルの外部にあることに注意してください。イベントがいつ発生したかを判断し、それらをイベント キューにプッシュするために必要な処理は、イベントを処理しているスレッドには参加しません。

私の質問は、ブラウザの JavaScript はシングル スレッドであると言うのは正しいですか? この質問をするのは、明らかに 2 つの別個のタスク (ここではイベントの処理とイベントのキューイングが並行して行われている) のためです。

4

2 に答える 2

11

JavaScript は、ブラウザーでも NodeJS でも、どこでもシングルスレッドです。いかなる方法でもマルチスレッドをサポートすることは想定されていませんでした (そして、おそらく誰かがある種のマルチスレッドを備えた JS エンジンを実装すると、確かに悪いことが起こるでしょう)

あなたの編集に答える編集:

そのイベント キューには、ブラウザのメイン ループからのデータ (マウス/kb イベント、ネットワーク イベントなど) が格納されます。JS を実行する同じメイン ループ。あなたが投稿した数字は正しいですが、それは(一種の)現実をぼやけさせます. 私の知る限り、すべてを処理するスレッドは 1 つだけです (つまり、キューを埋めて、行ごとに任意の JS コードを実行します)。

編集: これを証明する 1 つの方法: 非常に長いループとテキスト領域を作成します。ループの実行中にテキストを書き込んでみてください。できません。これは、メイン ループがループの実行でビジーであり、kb イベントを処理できないためです。

編集: これは本当に良い答えのようです: JavaScript はシングルスレッドであることが保証されていますか?

最後の編集から+2年後:この回答は少し古くなり、現実から切り離されています。io.js (およびその後の node.js、おそらく Chrom[e|ium]、FF、その後の Safari) は、(ワーカーを介して) マルチプロセスのサポートを推進しています。詳しくはこちらで確認できます。

于 2013-05-25T12:43:23.587 に答える