変数のスコープと巻き上げ

var x = 1;

function f() {
  document.write('<h1>x = ', x, '</h1>');
  var x = 2;
  document.write('<h1>x = ', x, '</h1>');
}

f();

この結果は、

1
2

ではなく、

undefined
2

になる。

function の中で var x = 2 を宣言しているが、宣言していることは認識しているけど代入していることは認識していないってこと?

これは分かりづらい…!

これが変数の巻き上げというやつらしい。
こちらの記事がわかりやすかった。

結論としては、

  • ローカル変数は必ず関数の先頭で宣言する
  • 単独var(let)パターン(ひとつの関数の中で変数宣言は1箇所にまとめる)を使う

で。