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具象メソッドを呼び出した結果とします。
- varAlreadyDeclaredが
false
、の
場合、
- 引数としてdnとconfigurableBindingsを渡して、 envのCreateMutableBinding具象メソッドを呼び出します。
- 引数としてdn、、およびstrictを渡して、 envのSetMutableBinding具象メソッドを呼び出します。
undefined