変数のスコープ(関数の中と外)

📝 問題の再掲

復習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 には影響しません。

← ドリルに戻る