変数
はい、久しぶりに、JavaScript学習初心者の備忘録記事ですよ。
初心者の人は読んでください。そうでは無い人は読まないでください。
別にJavaScriptだけでは無いんですが、変数にはローカル変数とグローバル変数とか存在しますよね。
ボクが大昔、BASICと言う言語を使っていた頃は、そんな概念は無かった気がします。
なんで、最近のプログラミング言語には、こんな面倒なルールがあるのでしょうか。
それをボクが自分に納得させるために、ここで記事にしてみます。
ローカル変数とグローバル変数
次のプログラムを見てみましょう。
function aaa(){
a = 3;
alert(a);
}
a = 5;
alert(a);
aaa();
alert(a);
1行目で、aaaと言う関数を定義していますよね。
その中で、aと言う変数に3を代入しています。
それを、alertで表示するので、3が表示されます。
関数定義はそれで終わり。
その後、aに5を代入しています。
そしてalertで表示するので、alertでは5が表示されます。
次に、aaa関数を呼び出しています。
さっき作ったとおり、aaa関数ではaに3を代入してalertで表示するので、結果として、3が表示されます。
では、最後のalertはどうでしょうか。
やってみればわかりますが、3が表示されます。
つまり、関数内で定義した、
a = 3;
が関数の外側のaにも影響しちゃってるわけです。
こんな風に、関数の内外で使う変数をグローバル変数と言うわけです。
グローバルはglobalつまりglobal(全世界)と言う意味の英単語です。
そもそも論ですが、関数って何のために作るんでしょうか。
それは、同じ処理を何度も書くのが面倒だからですよね。
だから、関数の中に処理を定義しておけば、関数を呼び出すだけで処理が実行される。
上記の関数は中身がカンタンなので、何度も書くのはそんなに面倒ではありませんが、複雑で長い処理なら、何度も書くのは大変ですしムダです。
関数はプログラムの中で何度も使い回せる。
この大前提を心に留めましょう。
すると、自ずから、グローバル変数の弊害が見えてきます。
上記のプログラムを見ればわかるように、関数の外側で、aに5を代入しているのに、関数が実行されると、aは3に変わってしまうのです。
長いプログラムであれば、面倒なコトになりますよね。
関数が呼び出されるたびに勝手に関数外の変数の値が変わってしまう。
それを解決するために、ローカル変数と言うのが存在するわけです。
さっきのプログラムをちょっとだけ変えます。
function aaa(){
var a = 3;
alert(a);
}
var a = 5;
alert(a);
aaa();
alert(a);
変数の宣言に、varを付けています。
var を付けると、変数は関数の中だけのローカル変数になります。
ローカルつまりlocal(限られた地域)と言う意味の英単語です。
これでプログラムを実行すると、まず、5と言うalertが表示され、そのあと関数が呼び出されるので3というalertが表示されます。
そして、最後には、また5と言うalertが表示されます。
つまり、関数の外側にあるaは、関数内のaからは影響を受けていません。
と言うよりも、関数の中のaと関数の外のaは全く同じ同姓同名のaと言う変数に見えますが、別人と言うことですね。
これであれば、関数がいつどこで何回呼び出されても、関数の外にある変数は影響を受けません。
グローバル変数は、特に長いプログラムでは、意図せずに他の変数に影響を及ぼしてしまう危険性がある。だから、グローバル変数を使わずにローカル変数を使いましょう、と色んな教科書に書いてあるわけです。
ついでに言うと、上記のようにローカル変数が影響するのは関数の範囲内だけですが、そう言う範囲のことを、スコープと呼びます。
スコープつまりscope(範囲)と言うそのままの英単語ですね。
ところで、上記の関数の外側にある、
var a = 5;
のaは関数の外なのでローカル変数では無くグローバル変数です。
グローバル変数だからvarを付けなくてもプログラムは動きますが、あえて付けています。
それは、varを付けると、変数を宣言しているんですよ、と人間にわかりやすくするためです。
変数を宣言するときにはvarを付ける、とルールを統一しておけば、プログラムが見やすくなりますよね。
と言うわけで、さっきも書いたとおり、今回のローカル変数とグローバル変数の話は、別にJavaScriptだけのことでは無いですね。
ちなみに、今回の話は、ローカル変数とグローバル変数の概念をボク自身が納得するための基礎的なモノです。
最新のJavaScriptの仕様では、var以外に、constやletも使えるようになっていますが、それは別の話なので、今回は省略します。