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

【JavaScript入門】グローバル変数とローカル変数

グローバル変数とローカル変数

 JavaScript の変数は、宣言される場所(スコープ)によって「グローバル変数」か「ローカル変数」かに分かれます。プログラム全体に渡ってどこからでも利用できるのがグローバル変数、特定のスコープ(ブロックや関数)内だけで有効なのがローカル変数です。一見するとグローバル変数は便利そうに見えますが、誤って上書きされやすく、バグの原因になりやすいので、なるべくローカル変数を使うのが望ましいです。

1.グローバル変数とローカル変数の違い

区分説明
グローバル変数スコープの外側(トップレベル)で宣言され、全域で利用できる変数。Web ブラウザ環境では window オブジェクトのプロパティ。
ローカル変数ブロックや関数の中で宣言され、その中だけで有効な変数。スコープが限定されるため、バグを防ぎやすい。

2.グローバルオブジェクト (window)

 Webブラウザで JavaScript を実行する際、最も外側に window と呼ばれるグローバルオブジェクトがあります。グローバル変数は自動的に window のプロパティとなるため、window.fruit と書くか、fruit と省略するかで同じ値にアクセスできます。

3.サンプルHTMLとJavaScript

 ファイル名を「localGlobalExample.html」として、以下のような例を用意しました。ブラウザで開き、コンソール(開発者ツール)を確認してみてください。

【localGlobalExample.html】

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>localGlobalExample.html</title>
</head>
<body>
  <h1>グローバル変数とローカル変数のサンプル</h1>
  <p>コンソールを開いて結果を確認してください。</p>

  <script>
    // 1. グローバル変数の宣言
    // window オブジェクトに直接代入(この書き方でなくても良いですが、わかりやすくするため)
    window.fruit = 'ミカン';
    console.log('グローバルで宣言された fruit:', fruit); // 省略形
    console.log('グローバルで宣言された window.fruit:', window.fruit);

    // 2. ローカル変数の例
    if (true) {
      let dessert = 'プリン'; // ローカル変数(このブロック内のみ有効)
      console.log('ローカルスコープ dessert:', dessert);

      // ブロックの内部でグローバル変数を上書きすることもできてしまう
      // ※ しかし推奨はされません
      window.fruit = 'リンゴ';
      console.log('ブロック内で書き換えた fruit:', fruit);
    }

    // 3. ローカル変数のスコープ外でアクセスするとエラー
    // console.log('スコープ外の dessert:', dessert); // ← ここはエラーになるのでコメントアウト

    // 4. 結局ブロックを抜けた後でも fruit は書き換えられたまま
    console.log('最終的なグローバル fruit:', fruit);
  </script>
</body>
</html>

実行結果

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

グローバルで宣言された fruit: ミカン
グローバルで宣言された window.fruit: ミカン
ローカルスコープ dessert: プリン
ブロック内で書き換えた fruit: リンゴ
最終的なグローバル fruit: リンゴ
  • dessertif ブロック内で宣言されているため、ブロック外では参照できません(エラーになる)。
  • fruit はグローバル変数なので、どこからでもアクセス可能です。そのため、ブロック内のコードで書き換えると、ブロックを抜けた後も上書きされたままの状態となります。

4.グローバル変数を避ける理由

  • 誤って上書きされやすい: どこからでもアクセス可能なため、意図せず上書きしてしまう危険がある。
  • 可読性の低下: 変数がどのスコープに属するか一目では分かりにくい。
  • 衝突のリスク: 他のスクリプトや外部ライブラリと同名のグローバル変数があると、想定外の挙動を引き起こす可能性が高い。

まとめ

  • スコープの外(トップレベル)で宣言した変数はグローバル変数となり、全ての場所から参照できます。
  • ブロックや関数の内部で宣言した変数はローカル変数としてスコープが限定され、バグが起きにくくなります。
  • グローバル変数はできるだけ使わず、ローカル変数でスコープを明確に管理する方が安全です。

 大規模なプログラムや他人が書いたコードと組み合わせる場合、グローバル変数は特にリスクを高めます。狭いスコープで必要な変数を宣言する癖をつけ、予期せぬバグを減らす工夫をしましょう。