クロージャ ~ JavaScript によるオブジェクト指向プログラミング
クロージャについては、次のページに少し詳しく書き直しました。よかったら、そちらをご覧ください。 「JavaScript の基本クロージャ」
前回のコードをもう一度見てみましょう。
var person = function (n) { var name = n; return { say_hello: function() { alert( name ); } }; }; var p1 = person('Ichiro Suzuki'); p1.say_hello();
これはオブジェクトリテラルで区切ると、次のように考えることができます。
すなわち、ファンクションオブジェクトと、その戻り値となるオブジェクト。 及びその戻り値となるオブジェクトの中で定義された、say_hello という名前の function オブジェクトです。
このように定義すると、内側の関数からその外側の変数にアクセスすることが出来ます。
これはどうしてかというと、JavaScript の関数オブジェクトはそれが生成されたときのコンテキストを保持しているからです。
上記の例で言うと、person('Ichiro Suzuki') として function オブジェクトを呼び出したとき、 return にてオブジェクトを生成します。この時に、say_hello という名前をつけられた function オブジェクトが生成されます。 このとき名無しの function オブジェクト内にいますが、JavaScript では function は変数の有効範囲であるスコープを持っています。従って、say_hello はコンテキストとしてこのスコープも保持することになります。 そのスコープ内に name がありますから、say_hello は変数 name にアクセス可能なのです。
このように、関数とこのコンテキストの組み合わせをクロージャ (closure) といいます。JavaScript の関数は実はクロージャなのです。
前回紹介したコードでプライベートメンバを定義しましたが、それが実装可能なのは JavaScript のクロージャのためなのです。