変数のスコープ(関数の中と外)
📝 問題の再掲
復習Q6: 関数内で let count = 0; と宣言してカウンターを作ったが、呼ぶたびに 1 しか返らない。なぜ?
→ 関数が呼ばれるたびに count が 0 に初期化されるため。
⚠️ よくある間違い
- 関数内の変数が外からアクセスできると思う
- 関数を呼ぶたびにローカル変数がリセットされることに気づかない
- グローバル変数とローカル変数の区別がつかない
📖 段階的な説明
ステップ1:グローバルスコープとローカルスコープ
- グローバルスコープ: 関数の外で宣言した変数。どこからでもアクセスできる
- ローカルスコープ: 関数の中で宣言した変数。その関数の中でしか使えない
ステップ2:関数の中の変数は外から見えない
function greet() {
let message = "こんにちは"; // ローカル変数
console.log(message); // ✅ OK
}
greet();
console.log(message); // ❌ エラー! message は関数の外から見えない
ステップ3:関数が呼ばれるたびにリセットされる
// ❌ うまくいかない例
function countUp() {
let count = 0; // 呼ぶたびに 0 に戻る!
count++;
return count; // 毎回 1 が返る
}
console.log(countUp()); // 1
console.log(countUp()); // 1(2にならない!)
ステップ4:解決策 — 関数の外に変数を置く
// ✅ 正しい例
let count = 0; // グローバルに置く
function countUp() {
count++; // 外の変数を更新
return count;
}
console.log(countUp()); // 1
console.log(countUp()); // 2 ✅
💡 たとえ話
関数 = 部屋、変数 = 部屋の中のメモ
部屋(関数)に入るたびに新しいメモ用紙が配られます。部屋を出たらメモは捨てられます。次に入ったときはまた新しいメモからスタートです。
部屋の外の廊下(グローバル)に貼ったメモは、何度部屋に出入りしても残り続けます。
✅ 確認問題
Q: 以下のコードで console.log(x) は何を表示する?
let x = 10;
function change() {
let x = 20;
}
change();
console.log(x);
答えを見る
10 が表示されます。関数内の let x = 20 はローカル変数なので、グローバルの x には影響しません。