クロージャて何がうまいの?

クロージャて何がうまいの?をはてなブックマークに追加 クロージャて何がうまいの?をdel.icio.usに追加 Yahoo!ブックマークに登録 クロージャて何がうまいの?をGoogle Bookmarksに追加

オライリーのJavaScriptを先輩にかりてずっと見てるんですけど、すごい勉強になります。普通メソッドを定義するときって、function hoge(){} て書くんですけど、無名関数を使って動的に関数名から定義できてしまうという事を知りました。

var inst = {};
inst[ "getProp" ] = function(){
return "hoge";
}
inst.getProp();
// hoge

getPropというメソッドは文字列で与えられているので、どんな関数名でも宣言できちゃうんですね。

var inst = {};
(function( inst, name ){
var prop;
inst[ "get" + name ] = function(){ return prop; };
inst[ "set" + name ] = function( param ){ prop = param };
})( inst, "Prop" );
inst.setProp( "hoge" );
inst.getProp();
// hoge
alert( inst.prop );
// undefined

こんなかんじでクロージャを使ったプライベートプロパティアクセサメソッドを定義できちゃいます。ちゃんとプロパティセッターを通さないとinstが(あたかも)保持するpropにアクセスできませんよという状態です。でも、なにがうまいの?と聞かれるとわかりません。が、次のクロージャの例は良く理解できました。

var counter = (function(){
var idx = 0;
return function(){ return idx++ };
})()
alert( counter() );    // 0
alert( counter() );    // 1
alert( counter() );    // 2

インクリメントされたidxを返す無名関数をcounterに返しているので、idxは直接触る事が出来ません。なるほど。これは意外と実用的かもしれませんね。

コメントをどうぞ