JavaScriptを使っていると必ず「スコープ」という言葉が出てきます。「スコープ」はとても大切でしかも便利なものです。
ここでは、「スコープ」とは何かや「グローバルスコープ」と「ローカルスコープ」の違い、関連する言葉である「ブロック」とは何かについて解説しています。
スコープとは何か?
スコープとは、プログラム内で変数が有効(アクセス可能)な範囲のことです。
スコープの種類
スコープには次の4つの種類があります。
大きいくくりだと「グローバルスコープ」と「ローカルスコープ」の2つのくくりです。名称の違いはありますが、根本的にはどこで変数を定義したか?の違いです。
グローバルスコープとは何か?
グローバルスコープとは、プログラム全体でアクセス可能な範囲のことです。
使い方はとても簡単で、関数の外で定義します。
let globalVar = "グローバル変数です!";
function showGlobalVar() {
console.log(globalVar);
}
showGlobalVar();
ローカルスコープとは何か?
ローカルスコープとは、関数の中でのみアクセス可能なスコープです。
関数の中で定義した変数を関数の外(スコープ外)で呼び出そうとすると存在しない状態となります。
関数スコープには次の2つがあります。
関数スコープ
関数スコープとは、関数内でのみアクセス可能なローカルスコープです。
関数内はアクセス可能
関数の中で定義し、その関数の中(同じスコープ内)では使うことができます。
function localFunction() {
let localVar = "関数スコープです!";
console.log(localVar);
}
localFunction();
・出力結果: 関数スコープです!
関数外(スコープ外)はエラーになる
一方、関数内で定義した変数を、関数の外(スコープ外)で呼び出そうとするとエラーになります。
function localFunction() {
let localVar = "関数スコープです!";
console.log(localVar);
}
console.log(localVar); //エラーになる
ReferenceError: localVar is not defined
ブロックスコープとは何か?
ブロックスコープとは、ブロック( {} )内でのみアクセス可能なローカルスコープです。関数スコープよりも範囲が狭いものになます。
ブロック内はアクセス可能
ブロックの中で定義し、そのブロックの中(同じスコープ内)では使うことができます。
if (true) {
let blockVar = "ブロックスコープです!";
console.log(blockVar);
}
・出力結果: ブロックスコープです!
ブロック外(スコープ外)はエラーになる
一方、ブロック内で定義した変数を、ブロックの外(スコープ外)で呼び出そうとするとエラーになります。
if (true) {
let blockVar = "ブロックスコープです!";
console.log(blockVar);
}
console.log(blockVar); //エラーになる
ReferenceError: blockVar is not defined
let, var, const
スコープと密接に関係する要素に変数を定義する「let」「var」「const」があります。
それぞれの詳細は下記をご参考ください。
【JavaScript】letとvarどちらを使うべきか?変数定義 constとの違い