解説
プログラムも行数が大きくなってくると、適切なサイズに分割しなければ把握できなくなってきます。
そういった際に重要なのは、変数の有効範囲です。ある場所で宣言した変数が、100万行あるプログラムの全ての場所で値を保持したままだった場合、プログラマーがその状態を把握するのは非常に困難です。
たとえば、100万行のプログラムの中に、変数が1万個あるとします。その全てに違う名前を付けて、その全てを把握しなければならないという状況を考えてください。そういったプログラムを書きたいとは思わないはずです。
できれば、100行から数100行程度の分かりやすい範囲の間だけで変数が有効で、それ以外の場所には影響が及ばず、別の場所では同じ名前の変数を宣言できる方が、プログラムは書きやすいです。
┏━━━━━┓ ┃ ┃ ┃変数a ┃ ┃変数b ┃←┐ ┃: ┃ │ ┃ ┃ │ ┗━━━━━┛ │ ├─ それぞれ独立している方が分かりやすい ┏━━━━━┓ │ ┃ ┃ │ ┃変数a ┃ │ ┃変数b ┃←┘ ┃: ┃ ┃ ┃ ┗━━━━━┛
そういった問題を解決するのが「スコープ」という概念です。多くのプログラム言語では、変数を宣言する場合、その宣言の仕方によって、その変数の有効範囲が決定するようになっています。
一例として、関数内で宣言した変数は「ローカル変数」となり、関数内だけで有効となります。そして、関数外で宣言した変数は「グローバル変数」となり、プログラム全体で有効になります。
プログラム全体
グローバル変数a プログラム
グローバル変数b 全体で有効
:
┏━━━━━━━━┓
┃関数X { ┃
┃ ローカル変数a┃関数X内
┃ ローカル変数c┃だけで有効
┃} ┃
┗━━━━━━━━┛
┏━━━━━━━━┓
┃関数Y { ┃
┃ ローカル変数b┃関数Y内
┃ ローカル変数d┃だけで有効
┃} ┃
┗━━━━━━━━┛
ローカル変数とグローバル変数の名前が同じ場合は、ローカル変数が有効な場合は、ローカル変数が優先されます。ただ、名前は別にしておいた方が、混乱が起きず、分かりやすいです。
また、プログラム言語によっては、グローバル変数とローカル変数が同じ場合でも、それぞれを利用する方法が用意されています。
この変数のスコープは、プログラミング言語の基本的な設計思想などに強く関係するため、プログラミング言語によって、その有効範囲は大きく違います。
プログラムを、どう整理して、分割するかは、プログラミング言語によって大きく違います。そして、その整理方法や分割方法に合わせて、スコープの仕様は設計されます。
変数がどの範囲有効かは、プログラム言語ごとに、仕様をきちんと確認する必要があります。
サンプル
変数の有効範囲が分かる処理を、JavaScriptで簡単に書いてみます。
<html>
<head>
<title>「スコープ」のサンプル</title>
</head>
<body>
<pre><script type="text/javascript">
// グローバル変数
var a = 0;
var b = 1;
document.writeln("global a : " + a);
document.writeln("global b : " + b);
// 関数1
function func1() {
// ローカル変数
var a = 100;
var b = 101;
// ローカル変数が優先される
document.writeln("func1 local a : " + a);
document.writeln("func1 local b : " + b);
}
// 関数2
function func2() {
// ローカル変数
var a = 200;
var b = 201;
// ローカル変数が優先される
document.writeln("func2 local a : " + a);
document.writeln("func2 local b : " + b);
}
func1();
func2();
// グローバル変数とローカル変数は独立している
document.writeln("global a : " + a);
document.writeln("global b : " + b);
</script></pre>
</body>
</html>
global a : 0 global b : 1 func1 local a : 100 func1 local b : 101 func2 local a : 200 func2 local b : 201 global a : 0 global b : 1
