初心者向け:暗黙的なグローバルとは?
JavaScript では「変数を宣言せずに代入すると、自動的にグローバル変数が作られてしまう」ことがあります。これを 暗黙的なグローバル(implicit global) と呼びます。初心者がよくハマるポイントで、バグの原因になりやすいので注意が必要です。
どういうこと?
通常は let や const で変数を宣言します。
let x = 10; // 正しい宣言
const y = 20; // 正しい宣言
JavaScriptところが、宣言を忘れていきなり代入すると…
function test() {
z = 30; // 宣言なしで代入
}
test();
console.log(z); // 30
JavaScript👉 この場合、z は グローバル変数として勝手に作られます。
つまり window.z(ブラウザ環境)や global.z(Node.js環境)に追加されてしまうのです。
なぜ危険なの?
- 意図せずグローバルを汚染する
- どこからでもアクセスできる変数が増えると、他のコードと衝突しやすい。
- ライブラリや他人のコードと変数名がかぶると予期せぬ動作になる。
- スコープの見通しが悪くなる
- 本来は関数内だけで使うつもりだった変数が、外からも見えてしまう。
- 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 を使う。
👉 初心者は「変数は必ず宣言する」と覚えておけば安心です。
