グローバルスコープとは何か
スコープは「変数がどこから見えるか(使えるか)」の範囲を指します。グローバルスコープは、プログラム全体からアクセスできる一番外側のスコープです。ここで宣言された変数は、関数やブロックの中からでも参照できます。便利ですが、どこからでも触れるため管理が難しく、名前の衝突が起きやすい場所でもあります。
実行コンテキストとの関係
実行コンテキストは「コードが実行されるときの環境情報のまとまり」です。グローバルコードが走ると「グローバル実行コンテキスト」が作られ、その中でグローバルスコープが用意されます。関数を呼ぶと関数実行コンテキストが作られ、関数固有のスコープが追加されます。結果として、内側から外側へ(関数 → グローバル)の順で変数が探索されます。
グローバル変数の宣言と見え方
JavaScript では「ファイルのトップレベル」で宣言するとグローバルになります。let と const はグローバルスコープに作られますが、ブラウザの window 直下には自動で載りません。var はブラウザ環境では window のプロパティにもなり、影響範囲が広くなります。基本的には let/const を使い、必要最小限だけグローバルに置くのが安全です。
// ブラウザでの例
var a = 1; // window.a にもなる
let b = 2; // window.b にはならない(グローバルスコープには存在)
const c = 3;
console.log(a, b, c); // 1 2 3
console.log(window.a); // 1
console.log(window.b); // undefined
JavaScript関数からグローバルを使う例
グローバルに設定した値は、関数の中から参照・更新できます。ただし、更新は副作用を生むため注意が必要です。読み取り中心にして、必要なら引数で渡す設計にすると安全性が上がります。
const taxRate = 0.1; // グローバル設定
function priceWithTax(price) {
return Math.floor(price * (1 + taxRate));
}
console.log(priceWithTax(1000)); // 1100
JavaScriptありがちな落とし穴(暗黙のグローバル)
宣言を忘れて代入すると、ブラウザでは暗黙のグローバルが作られることがあります。これにより、意図しない変数が全体に広がり、バグの原因になります。必ず let/const/var を付けて宣言し、厳格モード("use strict")を使えば未宣言の代入をエラーにできます。
"use strict";
function setValue() {
x = 10; // 未宣言。strict ならエラーで気づける
}
JavaScriptグローバルを最小化するコツ
グローバルは「設定値や共通ユーティリティ」など、本当に全体で必要なものだけに絞るのが基本です。モジュール(ES Modules)を使えば、ファイルごとのトップレベルはモジュールスコープになり、勝手にグローバルへ漏れません。値の共有が必要なら、明示的にエクスポート・インポートして、依存関係をわかりやすく保つと管理しやすくなります。
// tax.js(モジュール)
export const taxRate = 0.1;
// calc.js(モジュール)
import { taxRate } from "./tax.js";
export function priceWithTax(price) {
return Math.floor(price * (1 + taxRate));
}
JavaScriptグローバルスコープの注意点
名前の衝突が起きやすい
どこからでもアクセスできるため、同じ名前の変数を別の場所で使うと上書きされる危険があります。
管理が難しくなる
大きなプログラムではグローバル変数が増えると、どこで変更されたか追いにくくなります。
解決策
- 必要最小限だけグローバルに置く。
- 関数やブロックの中で
letやconstを使ってローカル変数を定義する。 - モジュールを使ってスコープを分ける。
まとめ
- グローバルスコープは「プログラム全体から見える一番外側のスコープ」。
- 実行コンテキストの最初に作られ、関数やブロックからも参照できる。
- 便利だが、名前の衝突や管理の難しさがあるため、使いすぎないことが大切。
初心者は「グローバルスコープは“みんなから見える場所”」とイメージすると理解しやすいです。
