こんにちは、ともです。
JavaScript勉強中でして、クロージャ(closure)というものに出会いました。
クロージャは他の言語でも出てきますので重要な項目だと感じています。
そこでJavaScriptにおけるクロージャについての理解をまとめておこうと思います。
クロージャとは
クロージャについてMDNによると次のように記述されています。
クロージャは、独立した (自由な) 変数を参照する関数です。言い換えるとクロージャ内で定義された関数は、自身が作成された環境を ‘覚えています’。
改訂新版JavaScript本格入門には次のように記述されています。
「ローカル変数を参照している関数内関数」のこと。
文字でみても理解しずらいのでコードをみます。
JavaScriptのクロージャ
function closure(init) {//funcA
var counter = init;
return function () {//funcB
return ++counter;
}
}
var myClosure = closure(1);
console.log(myClosure());// Out:2
console.log(myClosure());// Out:3
closureという高階関数を作成しました。この関数は関数 return function () {
を返します。
return ++counter;
}
funcB内でcounter
という変数を利用しています。counter
は関数外のfuncAで定義されています。
つまり、funcBはfuncAの変数を参照している関数です。
この参照関係はreturnでmyClosure
に格納後も維持されます。
よってmyClosure()
を呼出すたびにcounter
がインクリメントされます。
この参照関係が維持された状態の関数をクロージャと呼びます。
「ローカル変数を参照している関数内関数」のこと。
というJavaScript本格入門にあった上記の説明は理解し易いですね。
まとめ
クロージャという概念についてJavaScriptのコードを触りながら学びました。
関数内で関数外の変数を参照した状態を維持した関数をクロージャと呼ぶことが分かりました。他の言語でも見かけるワードですのでしっかり理解しておきたいです。