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