JavaScript | 基礎構文:変数・定数 – 暗黙的なグローバル

JavaScript
スポンサーリンク

初心者向け:暗黙的なグローバルとは?

JavaScript では「変数を宣言せずに代入すると、自動的にグローバル変数が作られてしまう」ことがあります。これを 暗黙的なグローバル(implicit global) と呼びます。初心者がよくハマるポイントで、バグの原因になりやすいので注意が必要です。


どういうこと?

通常は letconst で変数を宣言します。

let x = 10;   // 正しい宣言
const y = 20; // 正しい宣言
JavaScript

ところが、宣言を忘れていきなり代入すると…

function test() {
  z = 30; // 宣言なしで代入
}
test();
console.log(z); // 30
JavaScript

👉 この場合、zグローバル変数として勝手に作られます。
つまり window.z(ブラウザ環境)や global.z(Node.js環境)に追加されてしまうのです。


なぜ危険なの?

  1. 意図せずグローバルを汚染する
    • どこからでもアクセスできる変数が増えると、他のコードと衝突しやすい。
    • ライブラリや他人のコードと変数名がかぶると予期せぬ動作になる。
  2. スコープの見通しが悪くなる
    • 本来は関数内だけで使うつもりだった変数が、外からも見えてしまう。
  3. strict mode ではエラーになる
    • "use strict"; を有効にすると、暗黙的なグローバルは禁止され、ReferenceError が出る。
"use strict";
function test() {
  z = 30; // ReferenceError
}
JavaScript

防ぐ方法

  • 必ず let / const / var を使って宣言する
function test() {
  let z = 30; // これなら関数内だけ
  console.log(z);
}
test();
// console.log(z); // エラー:外からは見えない
JavaScript
  • strict mode を使う
"use strict";
a = 10; // ReferenceError(宣言なし代入を防げる)
JavaScript

実用例と比較

悪い例(暗黙的なグローバル)

function calc() {
  result = 100; // 宣言忘れ
}
calc();
console.log(result); // 100(グローバルに出てしまう)
JavaScript

良い例(宣言あり)

function calc() {
  let result = 100; // 関数内だけ
  console.log(result);
}
calc();
// console.log(result); // エラー:外からは見えない
JavaScript

ミニ練習

  • 問1: 以下のコードを修正して、暗黙的なグローバルを防げ。
function greet() {
  message = "Hello"; // 宣言なし
  console.log(message);
}
greet();
JavaScript

👉 修正版:

function greet() {
  const message = "Hello";
  console.log(message);
}
greet();
JavaScript
  • 問2: strict mode を有効にして、宣言なし代入を試してみよう。
"use strict";
x = 5; // ReferenceError
JavaScript

まとめ

  • 暗黙的なグローバルとは「宣言なし代入で勝手にグローバル変数が作られること」。
  • 危険性: グローバル汚染・予期せぬバグ・strict mode でエラー。
  • 対策: 必ず let / const で宣言、strict mode を使う。

👉 初心者は「変数は必ず宣言する」と覚えておけば安心です。

タイトルとURLをコピーしました