スコープとは
プログラミングにおいてのスコープとは、変数や関数の有効範囲のことです。
同じスコープ内であれば、変数の値の取得や代入、関数の呼び出しなどを行うことができます。
スコープの役割
スコープの役割として、下記が挙げられます。
変数の名前の衝突回避
変数は定められたスコープでのみ有効であるため、同じ名前の変数であっても、スコープが異なれば、別の変数として扱われます。
プログラム全体で一意となる変数の名前を定義する必要がなくなるため、コードの可読性やメンテナンス性を向上させることができます。
予期せぬ不具合の発生防止
スコープを広く設定した場合、意図していないところで変数を更新してしまう恐れや、改修に伴う影響範囲が広くなるといったリスクがあります。
スコープを適切な範囲で設定することで、不具合発生の抑制につながります。
メモリの最適化
変数が特定の関数内でのみ有効な場合、その関数の実行が終わると、変数が確保していたメモリは解放されます。
スコープを設定することで、不要となったメモリの占有を防ぐことができます。
静的スコープとは
静的スコープとは、レキシカルスコープとも呼ばれ、コードの構造によって設定されるスコープのことです。
変数が宣言された時点で、どこで定義されたかによってスコープが決まります。
グローバルスコープ
プログラム全体から参照可能な場合、その範囲をグローバルスコープといいます。
下記はJavaScriptのサンプルコードです。
// グローバル変数
var x = 'global';
console.log(‘トップレベルから参照した変数xの値:’ + x); // ①
function sample() {
console.log(‘sample関数からの参照した変数xの値:’ + x); // ②
}
sample();
実行結果
トップレベルから参照した変数xの値:global // ①
sample関数からの参照した変数xの値:global // ②
変数xはトップレベルで宣言されているため、グローバルスコープを持つ変数です。
プログラムのどこからでも参照できるため、同じくトップレベルからでも(①)、関数内からでも(②)参照することができます。
ローカルスコープ
特定の関数やブロック内でのみ参照可能な場合、その範囲をローカルスコープといいます。
また、参照可能な範囲が関数内であるものを「関数スコープ」、参照可能な範囲がifやforなどで囲まれたブロック内であるものを「ブロックスコープ」といいます。
関数スコープ
下記はJavaScriptのサンプルコードです。
function sample() {
//ローカル変数
var x = 'local';
console.log(‘sample関数の内部から参照した変数xの値:’ + x); // ①
}
sample();
console.log(‘sample関数の外部から参照した変数xの値:’ + x); // ②
実行結果
sample関数の内部から参照した変数xの値:local // ①
// ReferenceError 発生 ②
変数xはsample関数内で宣言されているため、関数スコープを持つ変数です。
同じ関数の内部からであれば参照できますが(①)、関数の外部からは参照できずエラーが発生します(②)。
ブロックスコープ
下記はJavaScriptのサンプルコードです。
if (true) {
//ローカル変数
var x = 'local';
console.log(‘if文の内部から参照した変数xの値:’ + x); // ①
}
console.log(‘if文の外部から参照した変数xの値:’ + x); // ②
実行結果
if文の内部から参照した変数xの値:local // ①
// ReferenceError 発生 ②
変数xはif文の中で宣言されているため、ブロックスコープを持つ変数です。
同じif文の内部からであれば参照できますが(①)、if文の外部からは参照できずエラーが発生します(②)。
動的スコープとは
動的スコープとは、ダイナミックスコープとも呼ばれ、コードの呼び出し順によって設定されるスコープのことです。
実行時に呼び出し元の関数を辿って変数を参照するため、スコープが動的に決まります。
下記はJavaScriptのサンプルコードです。
var x = 'global';
function sampleA() {
var x = 'sampleA'
sampleC(); // ①
}
function sampleB() {
sampleC(); // ②
}
function sampleC() {
console.log('変数xの値:' + x);
}
実行結果
変数xの値:sampleA // ①
変数xの値:global // ②
sampleA関数が呼び出し元となる場合(①)、参照されるのはsampleA関数内で定義されている変数xですが、sampleB関数が呼び出し元となる場合(②)、参照されるのはトップレベルで定義されている変数xとなり、呼び出し元によって変数xの値が変化します。
まとめ

プログラミングにおいてのスコープとは、変数や関数の有効範囲のことです。
スコープの役割としては、変数の名前の衝突回避、予期せぬ不具合の発生防止、メモリの最適化などが挙げられます。
スコープには「静的スコープ」と「動的スコープ」があります。
また、静的スコープには、プログラム全体から参照可能な「グローバルスコープ」と、特定の関数やブロック内でのみ参照可能な「ローカルスコープ」があります。
さらに、ローカルスコープには、関数内でのみ参照可能な「関数スコープ」と、ifやforなどで囲まれたブロック内でのみ参照可能な「ブロックスコープ」があります。
適切なスコープを設定することを意識して、効率的かつメンテナンス性の高いプログラム作りを目指しましょう。
無料のプログラミングスクール「テクドリ」の卒業生のインタビュー動画を、インスタグラムほか公式SNSにて公開中!