jsクローズドの用途


クローズドの用途を見に来ました.実は、クローズドを使うことによって、いろんなことができます.たとえば、オブジェクトに向かうコードスタイルをシミュレートします.より優雅で、より簡潔にコードを表現します.いくつかの態様でコードの実行効率を向上させる.
 
1匿名自己実行関数
      すべての変数を知っていますが、varキーを追加しないとデフォルトはグローバルオブジェクトの属性に追加されます.このような一時変数はグローバルオブジェクトに参加することに多くのデメリットがあります.
      例えば、他の関数はこれらの変数を誤用する可能性があります.全体のオブジェクトが大きすぎて、アクセス速度に影響を与えます.
      変数を使うたびにvarキーワードを使う以外に、実際にはしばしばこのような状況に遭遇します.すなわち、ある関数は一回だけ実行する必要があります.
var datamodel = {    
    table : [],    
    tree : {}    
};    
     
(function(dm){    
    for(var i = 0; i < dm.table.rows; i++){    
       var row = dm.table.rows[i];    
       for(var j = 0; j < row.cells; i++){    
           drawCell(i, j);    
       }    
    }    
       
    //build dm.tree      
})(datamodel);
      私たちは匿名の関数を作成し、直ちにそれを実行しました.外部はその内部の変数を参照することができないので、実行後すぐに解放されます.このメカニズムは全体のオブジェクトを汚染しないということが鍵です.
 
2キャッシュ
      もう一つの例を見てみます.処理に時間がかかる関数オブジェクトがあると想定しています.呼び出しごとに時間がかかります.計算された値を記憶しなければなりません.この関数を呼び出したとき、まずキャッシュで調べます.見つけられなかったら、計算してキャッシュを更新して値を返します.見つけたら、検索した値をそのまま返します.この点は、外部からの参照を解放しないので、関数内部の値を保持することができます.
var CachedSearchBox = (function(){    
    var cache = {},    
       count = [];    
    return {    
       attachSearchBox : function(dsid){    
           if(dsid in cache){//            
              return cache[dsid];//              
           }    
           var fsb = new uikit.webctrl.SearchBox(dsid);//      
           cache[dsid] = fsb;//        
           if(count.length > 100){//       <=100    
              delete cache[count.shift()];    
           }    
           return fsb;          
       },    
     
       clearSearchBox : function(dsid){    
           if(dsid in cache){    
              cache[dsid].clearSelection();      
           }    
       }    
    };    
})();    
     
CachedSearchBox.attachSearchBox("input1"); 
      このようにして、私たちは2回目にCachSearch Box.atch SerachBoxを呼び出すと、キャッシュからオブジェクトを取り出して、新しいsearchboxオブジェクトを作成する必要がないです.
 
3実装
      まずパッケージに関する例を見てもいいです.person以外の場所ではその内部の変数にアクセスできません.
var person = function(){    
    //          ,          
    var name = "default";       
       
    return {    
       getName : function(){    
           return name;    
       },    
       setName : function(newName){    
           name = newName;    
       }    
    }    
}();    
     
print(person.name);//    ,   undefined    
print(person.getName());    
person.setName("abruzzi");    
print(person.getName());    
   
      :  
   
undefined  
default  
abruzzi 
 
4対象に向けるオブジェクトの実現
      従来のオブジェクト言語は、クラスのテンプレート機構を提供しており、このように異なるオブジェクト(クラスの例)は、独立したメンバーおよび状態を有し、互いに干渉しない.JavaScriptにはこのような仕組みはないが、クローズドを使うことによって、このような仕組みをシミュレートすることができる.上記の例では、
function Person(){    
    var name = "default";       
       
    return {    
       getName : function(){    
           return name;    
       },    
       setName : function(newName){    
           name = newName;    
       }    
    }    
};    
     
     
var john = Person();    
print(john.getName());    
john.setName("john");    
print(john.getName());    
     
var jack = Person();    
print(jack.getName());    
jack.setName("jack");    
print(jack.getName());    
   
      :  
   
default  
john  
default  
jack 
      このコードから分かるように、johnとjackはいずれもPersonというクラスの例であり、この2つのインスタンスはnameというメンバーへのアクセスが独立しており、互いに影響がないからである.