Web制作、Web開発の歩き方

JavaScriptのきほんを学ぼう

■第3話:グローバル汚染を防ごう。スコープの重要性。

(最終更新日:2023.10.30)

JavaScriptの猫
この記事は5分で読めます!
(絵が小さい場合はスマホを横に)

「スコープって何故気にするの?」

プログラミングを始めたばかりだと、JavaScriptのvar, let, constの違いや、 それらのスコープの違いで戸惑うことも少なくない。 今回は「スコープとは何か」「何故スコープが重要か」「どう対処すれば良いのか」をごく簡単に紹介する。


1. 何故スコープを気にするのか?

「何故スコープを気にするのか」を考える前に、まずスコープとは何かについて説明する。 スコープとは定義した変数が使える範囲のことである。 関数の中で変数定義すれば関数の中でその変数は有効になり、Classの中で定義すればClassの中で有効になる。 では、なぜこのようなスコープ(影響範囲)が必要なのだろうか?

答えは「名前被りを防ぐため」である。

同じ名前の変数が、同じ影響範囲の中に複数存在すると上書きされるからである。 つまり、意図せず違う値(hensu = 4だと思ったら、hensu = 5になる)を持ち、不具合の原因を作ってしまうからである。 すなわち、スコープ(影響範囲)が広いと、別の値を再定義、もしくは最代入してしまうことが否めない。 下記(左)は意図せず再定義してしまった例である。下記(右)は意図せず再代入してしまった例である。 コード量が少なくてピンと来ないかもしれないが、100行以上のコードを書くと同じ名前で再定義しているものは見つけずらくなる。

スコープの影響

var(左:再定義)とlet(右:再代入)を使用した際の、意図しない値の取得

変数の影響範囲を限定するスコープを活用することで再定義、再代入のミスは防げる。 再定義に関してはconstやletを使えばエラーが出してくれる。再代入に関してはconstを使えばエラーを出してくれる。 const, let, varの再定義、再代入、スコープの違いは非常に重要なので下に再掲する。 下記のブロックスコープというのは、if文などの波括弧で囲まれた中ということを意味する。 初心者の方はそれでもピンとこないかもしれないが、今は焦らずコードを書きながら覚えていこう。 また、constを使うことで、再定義、再代入のエラーを防ぐことができる。 再定義、再代入を防ぐという意味で、それらを使う必要が無い変数は極力constで定義しよう。

const, let, varの特徴のまとめ

const, let, varの特徴のまとめ(第2話再掲)

2. グローバル変数を作らず、値を共有する方法

「グローバル変数を使わない」とは言っても、異なった関数間で変数を共有したい場合などが出てくる。 そういったときのための対処方法を2点ご紹介しよう。 「namespaceを使う」と「functionを使い、returnで取得する」である。

namespaceを使うには、波括弧を使って空のオブジェクト(namespace)を作り、名前を定義する。 1での考え方を踏襲すると、波括弧でスコープ(箱)を作ったと考えればよい。 この箱の中に変数を入れるには、myScope.〇〇という形で定義する。下記ではmyScope.aisatsuと定義した。 これにより、aisatsuという変数事態はmyScopeの箱の中に閉じられているので、 myScope.〇〇の名前が重複することだけ気をつければ、グローバルに値を共有しつつも名前被りを防ぐことができる。 同じネームスぺ-スを使わない限り、重複は無くなる。

namespaceを使う

namespaceを使う

次にfunctionを使い、returnで取得する方法を説明しよう。 これは、関数の戻り値に共有したい値を設定すれば、それで共有することができる。 ただし、関数名の名前被りを防ぐ必要は出てくる。 1関数1ファイルで同一ディレクトリに関数を保存すれば、名前被りは防げる。 工夫して、関数を適切に管理しよう。

functionを使い、returnで取得する

functionを使い、returnで取得する

他にもスコープを限定する方法は他にもある。最初の段階では関数の中、波括弧の中とスコープを意識して、 グローバル変数を作らないように気をつけよう。


3. 即時関数を使う

変数と同様、関数も同名を使うとエラーが生じる。 そのため、関数名も名前被りが生じないように、必要以上に使わない関数を増やさないことが大事だ。

関数名を付けずに、その場限りで使える関数がある。それが即時関数だ。 即時関数の中で定義された変数はスコープを保つことができる。関数自体はその場で実行することができる。 つまり「関数の名前被りを防ぐ」「グローバル変数の生成を抑える」という二つの効能がある。 その場限りの処理を行いたい場合は、ぜひ即時関数で実行するようにしよう。

即時関数を使おう

即時関数を使おう
(最初は少し書き方が難しい)

▼参考図書、サイト

 「JavaScriptの絵本 第2版 -Webプログラミングを始める新しい9つの扉-」 アンク 翔泳社
グローバル変数を乱用しない  中上級者になるためのJavaScript