インクリメントするグローバル変数があります(ここi
のフィドルを参照):
(function increment() {
i += 1;
})();
i = 0;
Chromeでは、エラーが発生しますUncaught ReferenceError: i is not defined
。
i
変数をここでホストするべきではないので、関数内increment
で変数は?i
として定義されます。undefined
インクリメントするグローバル変数があります(ここi
のフィドルを参照):
(function increment() {
i += 1;
})();
i = 0;
Chromeでは、エラーが発生しますUncaught ReferenceError: i is not defined
。
i
変数をここでホストするべきではないので、関数内increment
で変数は?i
として定義されます。undefined
変数宣言ステートメントが持ち上げられます。宣言はありません。
宣言ステートメントは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