2009-12-11 3 views
8

私は、たとえば、ChromeがJavascriptファイルをダウンロードしたときに、それが解釈され、JITされることを知っています。Javascriptは読み込み時に解析/解釈されますか? (IE)

私の質問は、IE6,7,8で最初にJavascriptファイルをダウンロードしたときに、解析され、解釈されるのですか?

私の理解では、トップレベルの関数シグネチャとグローバルスコープで実行されたものだけがロード時に解析されました。そして関数本体と残りは実行時に解析されました。

ロード時に完全に解析された場合、後で関数本体をダウンロードして解析することを遅らせることに時間がかかるとは思いますか?

+0

小さなニックピット、ええと私は訂正を意味します:V8 *決して*解釈しません、それは*常に*ネイティブコードにコンパイルします。インタプリタもありません。ネイティブコードコンパイラだけです。 –

+0

@JörgW Mittagはい、私は言いたい言葉を掘り下げていました:解析/解釈/実行。これらの2つは本質的に同じです:interpret/execute – Adam

答えて

2

はい、すべてのブラウザで、<script>タグを使用すると、リソースのダウンロードによってページ上の他のすべてがブロックされます(CSSのダウンロード、その他のJSのダウンロード、レンダリング)。

すべてのjavascriptを最初またはページ全体に読み込んでいる場合は、リクエストが約50msであり、ライブラリファイルなどの解析が100msを超える可能性があるので、しゃっくりが表示されます。 100msが標準として使用され、それ以上のものはユーザーによって「遅延」として認識されます。

時間の節約はごくわずかですが、ページが読み込まれているときに一時停止した場合のユーザーエクスペリエンスのわずかな低下は、状況によっては大きくなる可能性があります。

多くの記事については、LABjs' siteを参照してください。ローディングと解析の遅延のメリットについての大きな説明があります。

5

これらは完全に読み込み時に解析されます。 (IEはスクリプトを解析して、各関数の本体がどこで終わるかを知る必要があります)オープンソースの実装では、すべての関数がバイトコードやマシンコードにコンパイルされ、IEの動作は同じです。

実際に読み込みに時間がかかるページがあり、おそらく使用しない100Kのスクリプトの読み込みを延期できる場合は、読み込み時間に役立つことがあります。そうでない場合は、下記のアップデートをご覧ください。

(トリビア:SunspiderのようなJSベンチマークは一般的には、コードを解析し、コンパイルするのにかかる時間を測定していない。)

UPDATE - 私はこの答えを掲載するので、物事が変更されました!インプリメンテーションは、標準で必要とされるように、少なくとも構文上のエラーを検出するのに十分な負荷で各スクリプトを解析します。しかし、最初に呼び出されるまでコンパイル機能を延期することがあります。

+0

あなたのアップデート用のソースを共有できますか? –

+1

[SpiderMonkeyのソースコードはこちらです](http://hg.mozilla.org/mozilla-central/file/tip/js/src/)。 Parserクラスは、即座にコンパイル( 'Parser ')するためのASTを生成するか、構文エラー( 'Parser ')のみを検出するテンプレートであることに注意してください。実行時にコンパイルされていない関数が呼び出されると、 'js :: frontend :: CompileLazyFunction'が呼び出されます。 –

+0

ああ、ありがとうございます! –

3

関数の定義は実際には操作であるため、javascriptファイル全体が解析され、すべてのトップレベル操作が解釈されるためです。関数内のコードは、呼び出されるまで実際には実行されませんが、解析されます。例えば

var i=0; 
var print = function(a) { 
    document.getElementById('foo').innerHtml = a; 
} 

すべては、上記の例で解析取得し、ライン1と2を実行ます。しかし、3行目は呼び出されるまで実行されません。

スクリプトタグを上部ではなくHTMLの下部に置くなど、ユーザーが楽しめる「知覚的ゲーム」はほとんどありません。そのため、ブラウザはページの上部をレンダリングしてからダウンロードし、JavaScriptを解析するための指示。おそらく関数定義を文書にプッシュすることもできます。onload関数は、ページ全体がロードされてメモリに格納されるまで実行されません。しかし、これは、javascriptがビジュアルスタイルを物事に適用している場合(jQuery UIのようなもの)には、「非構造化コンテンツのフラッシュ」を引き起こす可能性があります。

+0

が解釈されると、それらは実行されますか? – Adam

+0

はい。私はインターネットエクスプローラが何かをジッツと信じていない。 –

+0

それが正しいのは興味深いことです。私は、次回の関数呼び出し時に性能上の理由からジッチングを行うと思います。私は、純粋な解釈が遅いという考えは古きよき考えであると思います。 – ChrisDiRulli

1

「ダウンロード」とはどういう意味ですか?それがタグに含まれているとき、またはXMLHttpRequestでダウンロードされたとき?

スクリプトでインクルードすることを意味する場合、IEはすべてのjsファイルを一度に解釈します。そうしないと、そのファイル内の関数を呼び出すことができないか、構文エラーメッセージが表示されます。

XMLHttpRequestでダウンロードする場合は、ファイルの内容を自分で評価する必要があります。

+0

私は、スクリプトタグ – Adam

関連する問題