Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Lexical Scope in JavaScript

2026年09月09日に「Dev.to」が公開したITニュース「Lexical Scope in JavaScript」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

JavaScriptのLexical Scopeは、変数の利用範囲を宣言場所で決めるルールだ。内側の関数は外側の変数を参照できるが、外側からは内側の変数を直接参照できない。変数は見つかるまで外側スコープを順に探す。

出典: Lexical Scope in JavaScript | Dev.to公開日:

ITニュース解説

JavaScriptを学ぶ上で、変数がコードのどこで使えるかを理解することは非常に重要である。この「変数が使える範囲」のことを「スコープ」と呼ぶ。スコープにはいくつか種類があるが、中でも特に基本的な考え方が「レキシカルスコープ」だ。レキシカルスコープとは、変数が宣言された場所、つまりコード上に書かれた位置によって、その変数がどこからアクセスできるかが決まるというルールのことを指す。簡単に言うと、変数をどこで定義したかによって、どこでその変数を利用できるかが決まる、ということである。

このレキシカルスコープの考え方を理解するために、具体的な例を見てみよう。

1let name = "Abishek";
2
3function greet() {
4    console.log(name);
5}
6
7greet();

このコードを実行すると、「Abishek」という文字列が出力される。なぜなら、nameという変数はgreet()関数の外側、つまりより広い範囲で宣言されているため、その内側にあるgreet()関数からname変数にアクセスできるからである。name変数はグローバルスコープ(プログラム全体のどこからでもアクセスできる範囲)で定義されており、greet()関数はグローバルスコープの中に存在するため、nameの値を利用できるのだ。この例が示しているのは、内側のスコープは、その外側にあるスコープで宣言された変数にアクセスできるという原則である。

次に、もう少し複雑な例を見てみよう。関数の中に別の関数が定義されている場合だ。

1function outer() {
2    let message = "Hello";
3
4    function inner() {
5        console.log(message);
6    }
7
8    inner();
9}
10
11outer();

このコードを実行すると、「Hello」という文字列が出力される。これは、messageという変数がouter()関数の中で宣言されており、inner()関数がそのouter()関数の中に定義されているため、inner()関数がmessage変数にアクセスできるからである。inner()関数はouter()関数の「内側」のスコープに位置し、message変数はouter()関数の「外側」のスコープ(ただし、inner()関数から見れば外側だが、outer()関数自身にとっては自身のローカルスコープ)に存在する。したがって、inner()関数はmessageの値を参照し、出力できる。

しかし、その逆は通常不可能である。つまり、関数内で宣言された変数を、その関数の外側から直接アクセスすることはできない。例えば、上記の例でouter()関数の外側からmessage変数にアクセスしようとしても、エラーが発生してアクセスすることはできない。これは、message変数がouter()関数のローカルスコープ、つまりouter()関数の中だけで有効な変数として定義されているためである。このことから、変数のアクセス方向について次の重要なポイントを覚えておくと良いだろう。内側のスコープは外側のスコープで宣言された変数にアクセスできるが、外側のスコープは内側のスコープで宣言された変数に直接アクセスすることはできない。変数の可視性は、コード上の宣言場所によって一方通行のルールで決まるのだ。

レキシカルスコープは、「スコープチェーン」という概念と密接に関連している。JavaScriptのエンジンがコードを実行し、特定の変数の値が必要になった時、まず現在の実行コンテキスト(現在のスコープ)内でその変数が宣言されているかを探し始める。もし現在のスコープで見つからなかった場合、エンジンは次にその外側のスコープを探しに行く。さらにそこでも見つからなければ、そのまた外側のスコープへと、変数を順に探し続ける。この「変数を順に辿って探していく鎖のような仕組み」をスコープチェーンと呼ぶ。

例えば、先ほどのinner()関数の例で考えてみよう。inner()関数内でmessageという変数にアクセスしようとするとき、まずinner()関数自身のスコープ内でmessageを探す。しかしinner()関数の中にはmessageは宣言されていない。そこで、一つ外側のスコープであるouter()関数のスコープへと探索の場所を移す。outer()関数のスコープにはmessageが宣言されているため、そこで変数の探索は終了し、その値が利用される。もしouter()関数のスコープでもmessageが見つからなければ、さらにその外側のグローバルスコープへと探索が進められる。このように、レキシカルスコープによって変数の宣言場所が決まることで、スコープチェーンが形成され、JavaScriptが変数を効率的に見つけることができるようになるのである。

レキシカルスコープは、JavaScriptにおいて非常に基本的でありながら重要な概念である。変数がコードのどこで宣言されたかによって、その変数がどこからアクセスできるかが決定されるというシンプルなルールが、プログラム全体の変数の可視性を支配している。この概念をしっかりと理解することで、変数の予期せぬ衝突を防ぎ、意図した通りのコードの動作を実現し、より信頼性の高いプログラムを作成するための基礎を築くことができる。特にシステムエンジニアを目指す上では、このような言語の基本的な動作原理を深く理解することが、複雑なシステムを設計・開発・デバッグする上で不可欠なスキルとなるだろう。

関連コンテンツ