変数と定数のスコープ
更新 : 2007 年 11 月
JScript には、グローバル、ローカル、およびクラスの 3 つのスコープがあります。関数やクラス定義の外部で宣言した変数または定数はグローバル変数になり、プログラム内のどこからでも値を参照したり変更したりできます。関数定義の中で変数を宣言した場合、その変数はローカル変数になります。ローカル変数は、関数が実行されるたびに生成され、関数の実行完了と同時に破棄されます。その関数の外部からは、変数にアクセスできません。クラス定義の内部で宣言した変数は、クラス内部で利用できるようになり、グローバル スコープからは直接アクセスできません。詳細については、「クラス ベースのオブジェクト」を参照してください。
説明
C++ などの言語には "ブロック スコープ" の機能があり、中かっこ ({}) で囲んで新しいスコープを定義できます。JScript ではサポートされていません。
ローカル変数には、グローバル変数と同じ名前を付けることができます。同じ名前を付けても、2 つの変数は完全に区別され、別の変数として処理されます。したがって、片方の値を変更しても、他方にはまったく影響はありません。ローカル変数が宣言されている関数の中では、ローカル変数だけが意味を持ちます。これを "参照可能範囲" と呼びます。
// Define two global variables.
var name : String = "Frank";
var age : int = "34";
function georgeNameAge() {
var name : String; // Define a local variable.
name = "George"; // Modify the local variable.
age = 42; // Modify the global variable.
print(name + " is " + age + " years old.");
}
print(name + " is " + age + " years old.");
georgeNameAge();
print(name + " is " + age + " years old.");
このプログラムの出力は、グローバル変数の値を変更せずに、ローカル変数の値を変更できることを示しています。関数内部から行ったグローバル変数の変更は、グローバル スコープの値に影響します。
Frank is 34 years old.
George is 42 years old.
Frank is 42 years old.
JScript では、変数と定数の宣言はすべてコードの実行前に処理されます。したがって、宣言が条件ブロックや他の構造の内部にあるかどうかは処理には影響しません。変数および定数をすべて検出した後、関数内のコードが実行されます。つまり、ローカル定数の値は、定数の宣言ステートメントが実行されるまで未定義です。また、関数で変数への代入が実行されるまでは、変数も未定義です。
この動作により、予期しない結果となる場合があります。例を次に示します。
var aNumber = 100;
var anotherNumber = 200;
function tweak() {
var s = "aNumber is " + aNumber + " and ";
s += "anotherNumber is " + anotherNumber + "\n";
return s;
if (false) {
var aNumber; // This statement is never executed.
aNumber = 123; // This statement is never executed.
const anotherNumber = 42; // This statement is never executed.
} // End of the conditional.
} // End of the function definition.
print(tweak());
このプログラムの出力は次のようになります。
aNumber is undefined and anotherNumber is undefined
aNumber は 100 または 123 となり、anotherNumber は 200 または 42 となると思えますが、実際にはどちらの値も undefined になります。aNumber および anotherNumber はどちらもローカル スコープで定義されるため、同じ名前のグローバル変数およびグローバル定数を隠ぺいします。ローカル変数およびローカル定数を初期化するコードが実行されていないため、これらの値は undefined になります。
高速モードでは、明示的な変数宣言が必要です。高速モードがオフの場合は、暗黙的な変数宣言が必要です。関数内部で暗黙的に宣言された変数、つまり var キーワードを使用せずに代入式の左辺に指定された変数はグローバル変数です。