2

外部スクリプトが UI スレッドをブロックする方法に関するこの素晴らしい記事を読みましたが、ブロックが実際に<script>タグまたはsrc='/myscript.js'src 属性の存在によるものかどうかは明確ではありませんでした。

私の質問は、インライン JavaScript (src 属性宣言がない) です。たとえば、次のようになります。

<script type='text/javascript'> alert('am i blocking too?');</script>

またはこれ:

<script type='text/javascript'> var php='<?=json_encode($myObj)?>';</script>

UIスレッドもブロックしますか?

4

3 に答える 3

6

JS ファイルのロードまたは JS の実行(外部ファイルまたはインラインに関係なく) は、UI スレッドをブロックします。

タグの例外は<script>、スクリプトがバックグラウンドで非同期にロードおよび実行される非同期ロードです。

またdefer、ページの残りの部分が読み込まれるまで、JS を実際に実行しないようにブラウザに指示する「遅延」読み込み (つまり、属性) もあります。

于 2012-09-22T16:41:19.250 に答える
2

web workers独自の獣である以外では、HTML Web ページと関連する Javascript をシングル スレッドと見なします。[1]

したがって、JavaScript がページで実行されている場合ユーザー インターフェイス全体がブロックされます。のようなものwindow.alert()で、クリアされるまで UI 全体window.confirm()window.prompt()ブロックしますが、無限ループでさえ、終了するまでブラウザー ウィンドウをフリーズさせます[2]。

編集 - コメントに基づいて、質問を編集します。

元の質問で提供されたリンクは、実行中の Javascriptの実行を参照していませんが、 Javscriptの読み込みの同期と非同期の性質について言及しています。このようなブロッキングが発生する理由の一例を紹介します。

JavaScriptの黎明期には、関数document.write()は Javascript が Web ページと対話する唯一の方法でした。document.writeそのため、Web ページが Javascript ファイルの読み込み要求に遭遇したとき、ブラウザは、Javascript ファイルがストリームに何かを挿入するために使用された場合に備えて、他のすべてを保留にする必要がありました。

今日の世界では、これはあまり起こらないため、ブラウザーはページ デザイナーに、「この Javascript ファイルは、いつ読み込まれるか正確には気にしないことを約束しますdocument.write()。また、他のトリッキーなことは使用しません。完了するまで凍結する必要はありません。

これが、最新の Web ブラウザーにdeferおよびasync属性がある理由です。

  1. Opera は特別ですが、無視します。
  2. またはブラウザ全体
于 2012-09-22T16:43:33.463 に答える
0

alert()または、ユーザーがプロンプトに応答するまで、その他のプロンプト アクションによってスレッドがブロックされます。彼らがどこにいても...

更新(コメントに関して):

ブラウザー ウィンドウは HTML を解析し、単一のスレッドで JS を実行します。そのため、完了するのに時間がかかる JavaScript コードはすべて、スレッドをブロックしalertますAJAX Request。 ..

于 2012-09-22T16:36:45.327 に答える