7

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

//完璧に動作します

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

しかし、関数を変数として宣言すると、「Uncaught ReferenceError: test is not defined」で失敗します:

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

そのため、JavaScript エンジンはコードを上から下に実行しない場合があります。最後に宣言されていても、関数をプリロードできます。それはどのように正確に機能し、その理由は何ですか?

4

1 に答える 1

9

これは、関数と変数の巻き上げの例です。関数と変数の宣言は、現在のスコープの先頭に移動されます。

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

ケース 1:

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

ケース 2:

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

testこのことから、2 番目のケースでは変数を実行しようとすると、変数が未定義であると推測できます。

于 2013-05-24T22:58:25.463 に答える