i i i i

varで変数を宣言すると、変数の巻き上げにより、
宣言部分は最も近い関数スコープ、もしくはグローバルスコープの先頭に移動し、
代入部分はそのままの位置に残るという動作をします。
先程のスクリプトは、このように実行されていると考えることができます。
function fn() {
// 最も近い関数スコープの先頭に巻き上げられた宣言部分
var x; { // 代入部分はそのままの位置に残る
x = 'a';
}
console.log(x);
}
fn();
よって、fn()の関数スコープ内で宣言された変数xにaが代入され、
そのxをconsole.log(x)で出力することになるので、
結果としてはaが出力されることになります。

もういっかい考えさせて…

最初の画面