閉鎖の目的を見てみましょう。実際、閉鎖を使用することで、多くのことができます。たとえば、オブジェクト指向のコードスタイルをシミュレートします。コードをよりエレガントかつ簡潔に表現します。いくつかの面でコード実行効率を改善します。
1匿名の自己執行関数
すべての変数がVARキーワードで追加されていない場合、デフォルトがグローバルオブジェクトのプロパティに追加されることを知っています。このような一時的な変数をグローバルオブジェクトに追加することには、多くの欠点があります。
たとえば、他の関数はこれらの変数を誤用する場合があります。グローバルオブジェクトが大きすぎてアクセス速度に影響を与えます(変数の値をプロトタイプチェーンから移動する必要があるため)。
変数を使用するたびにVARキーワードを使用することに加えて、一部の関数を1回だけ実行する必要があり、その内部変数を維持する必要がない状況に遭遇することがよくあります。
たとえば、UIの初期化では、閉鎖を使用できます。
コードコピーは次のとおりです。
var datamodel = {
テーブル : []、
木 : {}
};
(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);
}
}
// DM.Treeを構築します
})(datamodel);
外部がその内部の変数を参照できないため、匿名関数を作成してすぐに実行します。
したがって、実行後すぐにリリースされます。重要なのは、このメカニズムがグローバルオブジェクトを汚染しないことです。
2キャッシュ
別の例を取りましょう。各呼び出しを処理するのに長い時間がかかる非常に時間のかかる関数オブジェクトがあると想像してください。
次に、計算値を保存する必要があります。この関数を呼び出すとき、最初にキャッシュを見上げます。見つからない場合は、計算を実行します。
次に、キャッシュを更新し、値を返します。見つかった場合は、見つかった値を直接返してください。閉鎖は、外部参照をリリースしないため、まさにこれを行います。
したがって、関数内の値を保存できます。
コードコピーは次のとおりです。
var cachedsearchbox =(function(){
var cache = {}、
count = [];
戻る {
attachsearchbox:function(dsid){
if(dsid in cache){//結果がキャッシュの場合
キャッシュを返し[dsid]; //キャッシュ内のオブジェクトに直接返します
}
var fsb = new uikit.webctrl.searchbox(dsid); // new
キャッシュ[dsid] = fsb; //キャッシュを更新します
if(count.length> 100){//キャッシュのサイズが保証されています<= 100
cache [count.shift()]を削除します。
}
FSBを返します。
}、
ClearSearchbox:function(dsid){
if(dsid in cache){
cache [dsid] .clearselection();
}
}
};
})();
cachedsearchbox.attachsearchbox( "input1");
このようにして、cachedsearchbox.attachserachbox( "input1")を2回目に呼び出すと、
新しいSearchBoxオブジェクトを作成せずに、キャッシュからオブジェクトにアクセスできます。
3パッケージを実装します
まず、カプセル化に関する例を見てみましょう。内部の変数は、人の外ではアクセスできませんが、閉鎖を提供することでアクセスできます。
コードコピーは次のとおりです。
var person = function(){
//変数のスコープは関数内にあり、関数の外側にアクセスできません
var name = "default";
戻る {
getName:function(){
返品名;
}、
setName:function(newName){
name = newName;
}
}
}();
print(person.name); //直接アクセス、結果は未定義です
print(person.getName());
person.setname( "abruzzi");
print(person.getName());
結果は次のとおりです。
未定義
デフォルト
アブルッツィ
4閉鎖のもう1つの重要な目的は、オブジェクト指向のオブジェクトを実装することです。従来のオブジェクト言語は、クラステンプレートメカニズムを提供します。
このようにして、異なるオブジェクト(クラスのインスタンス)には独立したメンバーと状態があり、互いに干渉しません。 JavaScriptのクラスのようなメカニズムはありませんが、閉鎖を使用して、
このようなメカニズムをシミュレートできます。上記の例について話しましょう:
コードコピーは次のとおりです。
function person(){
var name = "default";
戻る {
getName:function(){
返品名;
}、
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());
操作結果は次のとおりです。
デフォルト
ジョン
デフォルト
ジャック
このコードから、名前メンバーへのアクセスが独立しており、互いに影響を与えないため、ジョンとジャックの両方が人クラスのインスタンスと呼ばれることがわかります。
上記はJS閉鎖の機能であり、非常にシンプルで理解しやすいです。友達に役立つことを願っています。