JavaScript
クロージャ

クロージャに関する重要な点をまとめておきます。(読書メモ)

以前、投稿した

JavaScriptのすべての関数はクロージャを定義します。(読書メモ)

に続き、以下、徹底マスター JavaScriptの教科書 「第8章 関数」からの引用です。

例 8-7 カウンタ関数を作る関数(無名関数版)

function makeCounter() {
    var count = 0;
    return function() {
        return count++;
    };
}

ここで、クロージャに関する重要な点をまとめておきます。

クロージャ理解のポイント

  • 外側の関数を呼んだときに、その関数のcallオブジェクトと入れ子の関数の関数オブジェクトが
    生成され、入れ子の関数の定義するクロージャが生成されます。つまり、外部関数はクロージャを
    生成するファクトリ関数と見なせます。
      

  • 外側の関数の callオブジェクトはクロージャの内部状態で、外側の関数が呼ばれるたびに異なる内部状態が生成されます。
     

  • 入れ子の関数の関数オブジェクトが存在している限りは、外側の関数のcallオブジェクトは存在し続けます。これは、外側の関数の関数オブジェクトが消失しても存続します。
     

  • クロージャの内部状態(外側の関数のローカル変数)は、外側から隠蔽されており、内側の関数からのみアクセスできます。

 
この本から前回引用したときにも書きましたが、個人的な感想として、
この本を読んでいると、JSのインタプリタのソースを読みたくなります。