2013-05-24 9 views
7

私はいつもブラウザが文字列によって上から下の文字列からJavaScriptコードを実行すると考えてきました(あなたはまあスクリプト言語からこの動作を期待しています)。しかし、明らかにそれはここの場合ではありません。JavaScriptはどのように解釈されますか?

//

<script> 
    test(); 
    function test() { alert('test'); } 
</script> 

完璧に動作しますが、私は、変数としての機能を宣言した場合、それは「キャッチされないにReferenceError:テストが定義されていない」で失敗し

<script> 
    test(); 
    var test = function() { alert('test'); } 
</script> 

したがって、javascriptエンジンは上から下にコードを実行しないことがあります。最後に宣言されていても、何らかの形で関数をプリロードすることができます。 どのように正確に動作し、なぜですか?

+0

私はfunction(){}がスコープの上部に移動する特別なケースだと思います。私は間違っている可能性があります。 –

+4

* [AST](http://en.wikipedia.org/wiki/Abstract_syntax_tree)のようなものに実行される前に完全に解析されます。このため、ソースのさらに下の行に「構文エラー」が表示されます。 – Matt

+0

トップの回答を見てください: http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname – viper

答えて

9

これは関数と変数ホイストの例です。関数と変数の宣言は、現在のスコープの先頭に移動します。

あなたの例では、内部的にこれに変換されます。

ケース1:

<script> 
    function test() { alert('test'); } 
    test(); 
</script> 

ケース2:あなたが推測することができます。このことから

<script> 
    var test; 
    test(); 
    test = function() { alert('test'); } 
</script> 

、その第二の場合、変数testで実行しようとすると、未定義です。

関連する問題