JavaScriptを習得したい

on Note

変数には有効範囲がある

変数を定義して、その変数をいざ使おうとした時、どの場所からでもその変数を参照できるというものでもありません。変数を参照しようとした場所、またはその変数を定義した場所によって、その変数を参照することができるかどうかが決まります。

言い換えれば、変数には有効範囲があるということです。

宣言した変数が有効となる範囲のことをスコープと呼びます。スコープは、変数がどの場所から参照できるのかを定義する概念です。

ある変数を参照しようとした時、その変数のスコープ内であれば参照できるが、スコープの外からは参照できずエラーとなります。

スコープはグローバルとローカルに大別される

グローバルスコープローカルスコープの違いは、その変数が、どの場所からでも参照できる変数なのか、そうでなく局所的な変数なのかです。

有効範囲が、そのプログラムの全てであるならグローバルスコープの変数ですし、局所的な有効範囲であるならその変数はローカルスコープということになります。

グローバルスコープの変数を、全ての場所から参照できる変数ということでグローバル変数と呼びます。ローカルスコープの変数をローカル変数と呼びます。

一番上の階層で定義した変数がグローバル変数で、どこからでも参照することができます。

一番上の階層でない場合とは、関数の中などでの定義のことです。この場合がローカル変数で、そのブロックの中だけが有効範囲になります。

また、限られた範囲を意味するローカルスコープは、ブロックスコープと関数スコープという2種類の、有効範囲の考え方に分かれます。

  • グローバルスコープ
  • ローカルスコープ
    • ブロックスコープ
    • 関数スコープ

ブロックスコープと関数スコープ

{ }(波括弧)で囲んだ、処理を記述する部分をブロックと呼びますが、{ }の中をブロックスコープと呼びます。

例えばif文は、if(条件式){処理} と、{ }(波括弧)の中に処理を書きますが、この{ }の中がブロックスコープに当たります。

if文のような構文でなく、{処理}というふうに、処理を書いた単なる{ }の中もブロックスコープです。とにかく{ }で囲まれた処理の部分はブロックスコープ、ということです。

{ }の中で定義した変数は、その{ }の外からは参照することができません。ローカル変数だからです。

有効範囲:ブロックスコープ

関数に対しての場合を関数スコープと呼んでいます。関数スコープで定義した変数は、その関数のブロックの外からは参照することができません。ローカル変数だからです。

有効範囲:関数スコープ

関数の仮引数も同じく関数スコープを持ちます。つまり仮引数は、他の関数からは利用できません。

変数の有効範囲をまとめると

変数の有効範囲(letで宣言した場合)は次の2点と言えます。

  • 宣言した階層のブロックスコープや関数スコープで有効。
  • 同じ階層だけでなく、宣言より下の階層でも有効。

宣言した階層より上の階層で使おうとするとエラーが出ます。

letで宣言した変数の有効範囲

有効範囲があることでのメリット

宣言した変数の有効範囲が限られることで、その変数が範囲の外に影響を与える、といったことを防げています。

プログラム中どこからでもアクセスできる、グローバルスコープで宣言した変数は一見便利に思えるかも知れません。しかしこの場合、どこからでもアクセスできてしまうからゆえに、思わぬエラーが起きることに繋がります。また、エラーが起きた際、エラーの原因を特定することも難しいでしょう。

スコープという考え方の下で変数を宣言し、その変数が影響する範囲を必要最低限に抑えることで、エラーが起きにくくし、またエラー範囲を限定します。