|
Microsoft® JScript 変数のスコープ |
チュートリアル |
Microsoft JScript には、グローバルとローカルの 2 種類のスコープがあります。変数を関数定義の外で宣言すると、その変数はグローバル変数になり、プログラム内のどこからでもその値を参照したり変更したりできるようになります。関数定義の中で変数を宣言した場合は、その変数はローカル変数になります。ローカル変数は、関数が実行されるたびに生成され、関数の実行完了と同時に破棄されます。その関数以外のコードからその変数にアクセスすることはできません。
ローカル変数には、グローバル変数と同じ名前を付けることができます。同じ名前を付けても、2 つの変数は完全に区別され、別の変数として処理されます。したがって、片方の値を変更しても、他方にはまったく影響はありません。このようなローカル変数を宣言した関数の中では、ローカル変数の方にしかアクセスできません。
同一のスコープ内では、どこで変数を宣言しても、その変数がスコープ内の先頭で宣言が行われたように処理されます。このことにより、スクリプトがプログラマの意図したとおりに動作しない状況も発生します。var aCentaur = "半身半馬の怪物、"; // aCentaur のグローバル定義。 // 簡潔に説明するため、ここに入れる JScript コードは省略します。 function antiquities() // この関数内でローカル変数 aCentaur を宣言します。 { // 簡潔に説明するため、ここに入れる JScript コードは省略します。 var aCentaur = "ケンタウロスは、おそらく馬に乗ったスキタイ人戦士です"; // 簡潔に説明するため、ここに入れる JScript コードは省略します。 aCentaur += "が、間違って報告されました。というのも、"; // ローカル変数に文字列を追加します。 // 簡潔に説明するため、ここに入れる JScript コードは省略します。 } // 関数はここで終わりです。 var nothinginparticular = antiquities(); aCentaur += "経験の浅い無知な兵士が遠くから見たためです。"; /* 関数内では、"ケンタウロスは、おそらく馬に乗ったスキタイ人戦士ですが、間違って報告されました。 というのも、" という文字列が変数に格納されます。関数の外では、文の残りの "半身半馬の怪物、経 験の浅い無知な兵士が遠くから見たためです。" が変数に格納されます。 */
コメントアウトされているステートメントは、ローカル変数 aNumber の値をローカル変数 newThing に代入しようとしています。ローカル変数 aNumber は、関数内の別の場所で宣言され、関数全体を通して存在します。しかし、このステートメントはうまく実行できません。これは、変数 aNumber が、このステートメントが実行される時点では、Undefined の状態で何も代入されていないからです。var aNumber = 100; var withAdditive = 0; withAdditive += aNumber; // ここでは withAdditive は 100 です。 tweak(); withAdditive += aNumber; // ここでは withAdditive は 200 です。 function tweak() { var newThing = 0; // 変数 newThing を明示的に宣言します。 // 次のステートメントは、コメントアウトしておかなければエラーが発生します。 // newThing = aNumber; // 次のステートメントは、42 という値をローカル変数 aNumber に代入することで、aNumber を明示的に宣言しています。 aNumber = 42; if (false) { var aNumber; // このステートメントは決して実行されません。 aNumber = "Hello!"; // このステートメントは決して実行されません。 } // 条件処理の終わり。 } // 関数定義の終わり。
© 1997 Microsoft Corporation.