はじめに
スコープについて理解しきれていない部分があったため、学習した内容をまとめます。
スコープとは
変数、定数、関数、型の名前の有効範囲を表すものをスコープといいます。
スコープはその範囲に応じてローカルスコープとグローバルスコープに分類されます。
同じスコープ内には同じ名前を複数存在させることはできず、変数、定数、関数、型の種類が異なっていたとしても名前は一意である必要があります。
ローカルスコープ
関数や制御構文によって定義されるスコープをローカルスコープといいます。
ローカルスコープで宣言された変数や定数は、関数や制御構文が持つ実行文の内部のみで有効で、スコープの外部からは参照できません。
上の例では、関数someFunction()内で定数aを宣言しています。
関数someFunction()内はスコープ内であるため定数aを参照できますが、関数の外はスコープ外となるため定数aを参照できず、コンパイルエラーとなっています。
ローカルスコープで宣言された変数や定数は限られた範囲からしか参照されないため、意図しない変更が起こりにくいというメリットがあります。
グローバルスコープ
どの関数にも型宣言にも含まれないスコープをグローバルスコープといいます。
グローバルスコープで宣言された変数や定数はファイル外も含めてどこからでも参照できます。
上の例では、グローバルスコープに定数globalAを定義し、関数someFunction()の内部と外部から参照しています。
グローバルスコープで宣言された変数や定数はどこからでも同じ名前で参照でき、意図しない変更を招きやすいため、ローカルスコープで宣言された変数や定数よりも説明的な命名が必要になります。
スコープの優先順位
同じスコープ内に同じ名前を複数存在させることはできませんが、異なるスコープには同じ名前を存在させることが可能です。
異なるスコープに同一の名前が存在する場合、名前を参照するスコープから最も近い祖先のスコープにあるものが優先されます。
例えばあるローカルスコープとグローバルスコープで同じ名前の定数が宣言されていた場合、ローカルスコープ内ではローカルスコープの方の定数への参照が優先されます。
上の例では、グローバルスコープと関数someFunction()のローカルスコープの両方に同じ名前の定数aを宣言し、それぞれのスコープから定数aを参照しています。
実行結果から、関数someFunction()のローカルスコープでは同じローカルスコープ内で宣言された定数aを参照し、グローバルスコープではグローバルスコープで宣言された定数aを参照していることがわかります。
まとめ
- スコープとは変数、定数、関数、型の名前の有効範囲を表すもの
- スコープは範囲に応じてローカルスコープとグローバルスコープに分類され、同じスコープ内には同じ名前を複数存在させることはできない
- 関数や制御構文によって定義されるスコープがローカルスコープ、どの関数にも型宣言にも含まれないスコープがグローバルスコープ
- 異なるスコープに同一の名前が存在する場合スコープには優先順位があり、名前を参照するスコープから最も近い祖先のスコープにあるものが優先される