このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【JavaScript入門】var:古い変数宣言

var:古い変数宣言

 JavaScript には、近年では letconst を使って変数を宣言するのが一般的ですが、以前からある var という宣言方法も存在します。var は古い仕様のため、現在は非推奨とされていることが多いですが、古いコードやライブラリでは今でも使われています。ここでは var の特徴や注意点を解説します。

1.古い変数宣言 var の特徴

種類スコープ再宣言巻き上げ時の仕様
letブロックスコープ+関数スコープできない。エラーになる。
var関数スコープのみできる(同名OK)変数の中身が undefined になる。
  • スコープvar はブロック({ })を無視して、関数の中かどうかだけで有効範囲が決まります。
  • 再宣言: 同じスコープ内でも同名の変数を何度でも宣言できます。これは意図しない上書きを誘発しやすく、バグの原因になります。
  • 巻き上げ (Hoisting)var で宣言された変数は、スコープの先頭に変数名だけが登録されているかのように扱われますが、中身は undefined のままです。後から宣言と同時に初期化が行われるイメージです。

2.var のスコープと再宣言の例

 以下のサンプルを「oldVarExample.html」というファイル名で保存し、ブラウザの開発者ツールで結果を確認してみましょう。ここでは、変数宣言に var を使い、関数スコープや再宣言の挙動を示しています。

【oldVarExample.html】

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>oldVarExample.html</title>
</head>
<body>
  <h1>var:古い変数宣言のサンプル</h1>
  <p>コンソールを開いて結果を確認してください。</p>
  <script>
    // var で宣言した関数(スコープ確認用)
    function scopeCheck() {
      console.log('--- scopeCheck 関数が呼ばれました ---');

      console.log('food の値(宣言前):', food); 
      // ここでは巻き上げにより food は存在するが、未初期化のため undefined

      var food = 'カレー';
      console.log('food の値(宣言後):', food);

      if (true) {
        // ブロック内だが、var は関数スコープのため同じスコープ
        var food = 'オムライス';
        console.log('food の値(if ブロック内):', food);
      }

      console.log('food の値(if ブロック後):', food);

      // 同スコープ内で再度 var food を宣言してもエラーにならない(同名再宣言)
      var food = 'ラーメン';
      console.log('food の値(再宣言後):', food);
    }

    scopeCheck();
  </script>
</body>
</html>

実行結果

デバッグコンソールの出力

 このサンプルをブラウザで実行すると、コンソールには以下のように表示されます(内容は上書きの状況をわかりやすくするための例です)。

--- scopeCheck 関数が呼ばれました ---
food の値(宣言前): undefined
food の値(宣言後): カレー
food の値(if ブロック内): オムライス
food の値(if ブロック後): オムライス
food の値(再宣言後): ラーメン
  • 巻き上げfood が宣言前にも存在扱いされるが、中身は undefined
  • ブロック内 (ifの中)var food を書いても、同じ関数スコープとして扱われるため、外側も書き換わる。
  • 再宣言 (var food) してもエラーにならず、値が再度代入されてしまう。

4.なぜ var は推奨されないか

  • ブロックスコープを無視するため、意図した箇所で変数が限定されない。
  • 同じ名前で何度でも再宣言可能なので、価値のあるデータが予期せず上書きされやすい。
  • 巻き上げ (Hoisting) による undefined やバグの発生リスクが大きい。

 その結果、「変数がどの範囲まで通用するのか」「いつ代入されるのか」がわかりにくくなり、バグの温床になりがちです。現在の JavaScript では、letconst を標準とし、よほどの理由がない限り var を使わないことが推奨されています。

まとめ

 var は過去の互換性維持のために残されている宣言方法で、関数スコープや自由な再宣言といった特徴を持ちます。しかし、思わぬバグを引き起こす可能性が高いため、現代の JavaScript では基本的に使う必要はありません。letconst を適切に使い分けて、コードの可読性と安全性を高めましょう。