Javascriptのクロージャについて解説
2019年03月15日
Javascriptのクロージャについての解説です。
Javascirptのクロージャとは何か
Javascriptのクロージャとは何か。
私の理解では
関数の中で関数を定義したもの
という理解です。
(あくまで私の理解です)
まず、基本的なところで
・ 関数を定義すると、関数内で定義した変数は関数外部から参照できない
という性質があります。
これはほとんどの人が知っていると思います。
例えば
function func() { var value = 1; console.log(value); } func(); // 1 console.log(value); // undefined
上記のようなプログラムの場合、関数を実行した場合、実行結果は
1になりますが、関数内の変数を出力した場合、
参照できていません。
function func() { var value = 1; function innerFunc() { value++; } innerFunc(); console.log(value); // 2 } func();
上記のようなプログラムの場合、関数の内部でinnerFuncという関数を定義して関数内で実行しています。
このinnerFUncをクロージャといいます。
innerFunc内では、外側の関数(エンクロージャ)で定義している
変数valueを呼び出していますが、その値を参照できているだけでなく、
更新することができます。
つまり、javascriptでは、関数の中で定義された関数の仕様は通常の
関数と、その外側の領域と違い、その関数内部で変数を参照したり、更新
したりできるのです。
このような仕組みを利用して、関数を定義する際に使用することがありますので、
性質として覚えておくと良いでしょう。
どのようなときに使うのか?
上記のクロージャの仕組みを使うと、関数内の変数の値を維持したまま、
その関数内の値を更新するプログラムをかけたりします。
例えば、関数内で定義した変数を、その関数内の関数を定義して返すような
関数にすることで、関数の外で変数を定義して更新したりしなくても、
関数を実行する度に関数を実行できたりするわけです。
書き方によってはクロージャを使わなくても実装できる場合もありますが、
コードがよりシンプルになったり、便利なケースがあるようです。
(未だにそういう場面に遭遇したことがないので分からない・・・)