カテゴリ: JavaScript 更新日: 2025/11/30

JavaScriptのスコープ(関数スコープとブロックスコープ)を理解する

JavaScriptのスコープ(関数スコープとブロックスコープ)を理解する
JavaScriptのスコープ(関数スコープとブロックスコープ)を理解する

先生と生徒の会話形式で理解しよう

生徒

「先生、JavaScriptのスコープって何ですか?聞いたことはあるけど、よくわかりません。」

先生

「スコープとは、変数や関数が使える範囲のことを言います。簡単にいうと、『どこからその変数を見たり使ったりできるか』の範囲ですね。」

生徒

「なるほど。でも、どうしてそんな範囲が必要なんですか?」

先生

「変数があちこちで自由に使えると、名前がかぶってしまったり、予期しない動きをすることがあるからです。スコープを使うことで安全にプログラムを作れるんですよ。」

生徒

「スコープには種類があるんですか?」

先生

「はい。JavaScriptには主に『関数スコープ』と『ブロックスコープ』の2種類があります。これらの違いを理解すると、変数の使い方がずっとわかりやすくなりますよ。」

1. スコープとは?

1. スコープとは?
1. スコープとは?

スコープは「変数や関数がアクセスできる範囲」のことです。プログラム内の変数は、どこで使えるかが決まっています。

たとえば、家の中に「自分の部屋」や「リビング」があるように、変数にも「見える場所」が決まっています。

スコープがあることで、同じ名前の変数を別々の場所で使ってもお互いに影響しないようにできます。

2. 関数スコープとは?

2. 関数スコープとは?
2. 関数スコープとは?

関数スコープは、「変数が関数の中でだけ有効になる」スコープのことです。

昔からJavaScriptで変数を作るときに使われていたvarは、この関数スコープに従います。

たとえば、関数の中でvarで作った変数は、関数の外からは見えません。


function test() {
  var message = "こんにちは";
  console.log(message); // こんにちは
}
test();
console.log(message); // エラー:messageは見えない

上の例では、関数の外からmessageを見るとエラーになります。これは、関数スコープのおかげです。

3. ブロックスコープとは?

3. ブロックスコープとは?
3. ブロックスコープとは?

ブロックスコープは、「{ }(中かっこ)で囲まれた範囲内だけ変数が有効になる」スコープです。

ES6(2015年)から導入されたletconstで作る変数は、このブロックスコープに従います。

たとえば、if文やfor文の中でletで作った変数は、その中だけで使えます。


if (true) {
  let count = 10;
  console.log(count); // 10
}
console.log(count); // エラー:countは見えない

このように、中かっこの外からはcountは見えません。

4. varとlet、constの違い

4. varとlet、constの違い
4. varとlet、constの違い

JavaScriptで変数を作るときはvarletconstの3つがあります。

  • varは関数スコープ。中かっこだけのブロックスコープは無視されます。
  • letconstはブロックスコープ。中かっこで囲まれた範囲だけ有効。
  • constは「再代入できない変数」を作るときに使います。

function example() {
  if (true) {
    var a = 1;
    let b = 2;
    const c = 3;
    console.log(a, b, c); // 1 2 3
  }
  console.log(a); // 1(関数スコープなので見える)
  console.log(b); // エラー(ブロックスコープなので見えない)
  console.log(c); // エラー(ブロックスコープなので見えない)
}
example();

5. なぜスコープを理解することが大切?

5. なぜスコープを理解することが大切?
5. なぜスコープを理解することが大切?

スコープを知らないと、変数の名前がかぶったり、思わぬところでエラーが起きたりします。

また、大きなプログラムを作るときに変数の管理が難しくなります。

スコープを正しく使うことで、バグを減らし、読みやすく安全なコードを書くことができます。

6. 「関数スコープ」と「ブロックスコープ」の整理

6. 「関数スコープ」と「ブロックスコープ」の整理
6. 「関数スコープ」と「ブロックスコープ」の整理

JavaScriptのスコープには大きく分けて「関数スコープ」と「ブロックスコープ」があります。

varは関数スコープ、letconstはブロックスコープに従います。

これを理解しておくと、変数の使い方がぐっと安全でわかりやすくなります。

プログラムを書くときは、基本的にletconstを使うのがおすすめです。

まとめ

まとめ
まとめ

JavaScriptのスコープは、変数を安全に使うための基本的でありながら非常に奥深い考え方です。特に関数スコープとブロックスコープの違いを知ると、なぜ意図しない変数の上書きやエラーが起こるのかが自然と理解できるようになります。関数スコープは関数の中全体をひとつの範囲として扱い、昔から使われてきたvarが従うルールです。一方で、letconstはブロックスコープにより、より細かい範囲で変数を管理することができます。これは複雑なプログラムを扱うほど重要性が増し、特に条件分岐やループ構造の中での予期せぬ変数の衝突を避けるのに役立ちます。 変数の寿命や見える範囲が明確であれば、コード全体の見通しがよくなり、読みやすく手直ししやすいプログラムが作れるようになります。とくに大規模なプロジェクトや複数人での開発では、スコープを意識した変数管理が欠かせません。JavaScriptが進化してletconstが便利に使えるようになった現在では、改めてスコープの理解が欠かせない基礎力になっています。初心者のうちからスコープの挙動を自然に使えるようになると、エラーの原因を直感的に理解できるようになり、コードの品質も大きく向上します。

スコープの理解を深めるサンプルコード

関数スコープとブロックスコープをより具体的に比較するために、次のサンプルコードを用意しました。実際に動かして違いを確かめると理解がいっそう深まります。


function sampleScope() {
  var x = "関数の中のx";
  if (true) {
    var x = "再宣言されたx(関数スコープ)";
    let y = "ブロックの中のy";
    const z = "変更できないz";
    console.log(x); // 再宣言されたx
    console.log(y); // y
    console.log(z); // z
  }
  console.log(x); // 再宣言されたx(関数スコープなので外にも影響)
  console.log(y); // エラー
  console.log(z); // エラー
}
sampleScope();

この例からもわかるように、varはブロックスコープを無視してしまうため、予期せぬ上書きが起きることがあります。それに対してletconstはブロック単位で変数を守ってくれるため、安全に管理できる点が非常に便利です。現代の開発でvarよりもletconstが推奨される理由もここにあります。また、スコープは変数の生存期間にも影響するため、不要なメモリ消費を避けたり、データの意図せぬ露出を防ぐためにも理解しておきたい重要な要素です。 JavaScriptのスコープは広い範囲にわたり、非同期処理やクロージャといった概念とも密接に関わります。今回の学びを土台に、より高度な仕組みを学ぶとスコープがさらに役立つことを実感できるはずです。

先生と生徒の振り返り会話

生徒

「先生、関数スコープとブロックスコープの違いが前よりはっきりわかりました。でも実際の開発ではどっちを使うことが多いんですか?」

先生

「とても良い質問ですね。現在のJavaScriptでは、ほとんどの場面でletconstが使われます。安全で、思わぬ書き換えを防げるからです。」

生徒

「たしかにvarは便利そうに見えたけれど、上書きされるのはちょっと怖いですね…。」

先生

「その感覚はとても大切です。スコープの広さを意識できるようになると、変数がどこまで届くか、どこで消えるかを自然に考えられるようになります。それがバグの防止にもつながるんですよ。」

生徒

「ブロックスコープはシンプルですね。中かっこで囲んだところだけ有効って、覚えやすいです。」

先生

「そのとおりです。特にfor文やif文での変数管理はブロックスコープのおかげでとても扱いやすくなりました。これからJavaScriptを書くときには、ぜひ今回の学びを意識してみてください。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JavaScriptのスコープとは何を意味する言葉ですか?

JavaScriptのスコープとは、変数や関数がどこから見えて、どこで使えるかという「有効範囲」を示す仕組みです。スコープを理解することで、同じ名前の変数が干渉しない安全なコードを書くことができます。
カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptでパスエイリアスを設定する方法!baseUrlとpathsでコードをスッキリ整理
New2
JavaScript
JavaScriptのfor文の書き方を初心者向けにやさしく解説
New3
JavaScript
JavaScriptの関数でよくあるエラーとその解決法まとめ
New4
JavaScript
JavaScriptのイベント処理でよくあるエラーとその対処法
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのマウスイベントの使い方(click, mouseoverなど)
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptのtoStringとString関数の違いを初心者向けに解説
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptの純粋関数(pure function)と副作用の違いを理解しよう
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptプログラムの実行方法まとめ!ブラウザ・Node.js・コンソールの使い方
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptで文字列をforループで1文字ずつ処理する方法!初心者向け解説
No.7
Java&Spring記事人気No7
TypeScript
TypeScript学習におすすめの無料教材・リファレンスサイト【初心者向け】
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】