1

JS関数(つまりsetTimeout(function(){...}, TIME))は、パラメーターとして受け取った関数をブラウザーのイベントループに配置し、このイベントループは、すべてのインライン/同期JS呼び出しが処理された後に処理されることを認識しています。

しかし、彼が次のHTMLページ構造を持っている場合、実際にはどうなりますか。

<html>
 <head>
  <script> MANY INLINED SCRIPTS </script>
  <script src="file.js"></script>
  <script> setTimeout(function(){...}, TIME)</script>
   .
   .
   .

</html>そしてページは進み、おそらくこの構造はに達するまで繰り返されます。

このような状況でイベントキューはいつ処理されますか?

編集:自分のページのスクリプト用に、ある種のレイジーローダーを作成したいと思います。私は、DOMが解析され、できればレスポンシブになった後にのみ表示されるはずの、他のソースからのコンテンツに依存しています。

4

1 に答える 1

4

</script>各インラインスクリプトは、終了タグが見つかるとすぐに処理されます。同様に、<script>サーバーからスクリプトを個別のファイルとしてインポートするタグは、ファイルの受信時に処理され、そのプロセスは同期的です。ブラウザーは、スクリプトの内容を待ってから処理します(ただし、タグの編集<script>タグの比較的新しい「非同期」属性を参照してください)。 IEの古い「defer」属性。これは、予想どおりに機能した場合と機能しなかった場合があります(@RobGに感謝)。

したがって、呼び出しを含むインラインコードはsetTimeout()、ブラウザが完全な<script>ブロックを確認したときに実行され、渡された関数は、指定されたミリ秒数(おおよそ)が経過した後に呼び出されます。タイムアウト処理の精度に大きく依存することはできません。

タイムアウトメカニズム以外にも、ユーザーインタラクション、ajaxなどのイベントがあります。これらはすべて、概念的には同じゲートウェイを経由します。つまり、タイムアウトの実行がスケジュールされているが、ユーザーが数ミリ秒前にボタンをクリックした場合、タイマーコードはボタンの処理が終了するのを待ちます。

于 2012-10-04T14:25:40.217 に答える