1

重複の可能性:
JavaScript 変数の再宣言

次のコードがあります。

var i = 11;
alert(i);
function a(){
    alert(i);
    var i = 2;
    alert(i);
}
a()

2 番目alert(i)(関数内) は を生成しundefinedます。JSエンジンがコードを実行する方法に関係していると思います.行を通過する前に、最初に変数を保存しないのでしょうか?

とにかく巻き上げに対応しているのでこれはJSなら問題ないと思いました。私はおそらくそれを間違えました - 誰か説明してくれませんか?

ありがとう!

4

1 に答える 1

4

JavaScriptは確かに宣言をそれらが発生する範囲の一番上に引き上げますが、割り当てはそれらが発生すると予想される場所で発生します。コードは次のように効果的に解析されます。

/* Function declarations are hoisted first, which is why you can invoke a
   function before it appears to be defined in the source */
function a() {
    var i; // Declaration is hoisted (this i shadows the outer i)
    alert(i);
    i = 2; // Assignment to local i happens in place
    alert(i);
}
var i; // Declaration is hoisted (at this point, i === undefined)
i = 11; // Assignment happens in place
alert(i);
a();

これは仕様で詳しく説明されています。新しい実行コンテキストに入ると、次のようになります。

コード内のVariableDeclarationおよびVariableDeclarationNoIndごとに、ソーステキストの順序で実行します。

  • dnをdの識別子とします
  • varAlreadyDeclaredを、引数としてdnを渡してenvのHasBinding具象メソッドを呼び出した結果とします。
  • varAlreadyDeclaredfalse、の 場合、
    • 引数としてdnconfigurableBindingsを渡して、 envのCreateMutableBinding具象メソッドを呼び出します。
    • 引数としてdn、、およびstrictを渡して、 envのSetMutableBinding具象メソッドを呼び出します。undefined
于 2012-12-04T09:06:54.703 に答える