以前、投稿した
JavaScriptのすべての関数はクロージャを定義します。(読書メモ)
に続き、以下、徹底マスター JavaScriptの教科書 「第8章 関数」からの引用です。
例 8-7 カウンタ関数を作る関数(無名関数版)
function makeCounter() {
var count = 0;
return function() {
return count++;
};
}
> ここで、クロージャに関する重要な点をまとめておきます。
> **クロージャ理解のポイント**
> - 外側の関数を呼んだときに、その関数のcallオブジェクトと入れ子の関数の関数オブジェクトが
生成され、入れ子の関数の定義するクロージャが生成されます。つまり、外部関数はクロージャを
生成するファクトリ関数と見なせます。
> - 外側の関数の callオブジェクトはクロージャの内部状態で、外側の関数が呼ばれるたびに異なる内部状態が生成されます。
- 入れ子の関数の関数オブジェクトが存在している限りは、外側の関数のcallオブジェクトは存在し続けます。これは、外側の関数の関数オブジェクトが消失しても存続します。
- クロージャの内部状態(外側の関数のローカル変数)は、外側から隠蔽されており、内側の関数からのみアクセスできます。
この本から[前回引用したとき](https://qiita.com/jun68ykt/items/6ea68c2d44601c241dad)にも書きましたが、個人的な感想として、
この本を読んでいると、JSのインタプリタのソースを読みたくなります。