4

インクリメントするグローバル変数があります(ここiのフィドルを参照):

(function increment() {
   i += 1;   
})();

i = 0;

Chromeでは、エラーが発生しますUncaught ReferenceError: i is not defined

i変数をここでホストするべきではないので、関数内incrementで変数は?iとして定義されます。undefined

4

1 に答える 1

7

変数宣言ステートメントが持ち上げられます。宣言はありません。

宣言ステートメントはvar、変数を宣言するために使用します。宣言していないので、代入式だけがあります。これは、式の評価時にグローバル変数を暗黙的に作成します。

言い換えれば、正式な宣言がないということは、巻き上げがないことを意味します。


ここで、変数宣言を引き上げることができるように、正式に宣言したとましょう。IIFE内の操作は結果として生じNaNますが、後の。の割り当てによって上書きされます0

これは、割り当てではなく、宣言のみが引き上げられるためです。

// The 'var i' part below is actually happening up here.

(function increment() {
   i += 1;   // "i" is declared, but not assigned. Result is NaN
})();

var i = 0; // declaration was hoisted, but the assignment still happens here

console.log(i); // 0
于 2012-10-11T16:30:48.603 に答える