程式碼如下:
var CachedSearchBox = (function () {
var cache = {},
return {
attachSearchBox: function (dsid) {
(dsid in cache) {//如果結果在快取中
}
var fsb = document.getElementById(dsid);///新
cache[dsid] = fsb;//更新快取
的大小 delete cache[count.shift()];
}
},
clearSearchBox: function (dsid) {
cache[dsid].clearSelection();
🎜> }
} Box.attachSearchBox("input1");
//alert(obj1);
var obj2 = CachedSearchBox.attachSearchBox var obj2 = CachedSearchBox.attachSearchBox var obj2 = CachedSearchBoxBox ("input1");
實現封裝:
複製代碼
程式碼如下: name = newName; }
}
}();
print(person.name);//直接訪問,結果為undefined
print(person.getName());
person.setName("jack");
print(person.getName());
得到結果如下:
undefined
default
jack
閉包的另一個重要用途是實現面向對像中的對象,傳統的對象語言都提供類的模板機制,這樣不同的對象(類的實例)擁有獨立的成員及狀態,互不干涉。雖然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
デフォルト
ジャック
JavaScript クロージャが注意すべき問題:
1. メモリ リーク:
インタープリタ自体の欠陥により、さまざまな JavaScript インタープリタ実装で、クロージャはメモリ リークを引き起こす可能性があります。メモリ リークは深刻な問題であり、ブラウザの応答速度に重大な影響を及ぼし、ユーザー エクスペリエンスを低下させ、さらにはブラウザが応答しなくなることもあります。 JavaScript インタプリタにはすべて、参照カウントの形式を採用するガベージ コレクション メカニズムがあり、オブジェクトの参照カウントがゼロの場合、このプロセスは自動的にリサイクルされます。ただし、クロージャの概念では、将来のある時点でローカル変数を使用する必要がある可能性があるため、このプロセスは複雑になります。循環参照が発生した場合、ガベージ コレクション メカニズムはこれらの外部参照を処理しません。 、オブジェクト A が B を参照し、B が C を参照し、C が A を参照すると、ガベージ コレクション メカニズムはその参照カウントがゼロではないと判断し、メモリ リークが発生します。
2. コンテキスト参照:
$(function(){
var con = $("div#panel");
this.id = "content";
con.click(function() {
alert(this.id);//panel
});
});
ここでのalert(this.id)はどの値を指しますか?多くの開発者は、クロージャの概念に基づいて誤った判断を下す可能性があります:
content
その理由は、this.id にクリック コールバックに表示される値が割り当てられ、クロージャが参照することを形成するためです。 .id なので、戻り値は content です。ただし、実際には、このアラートは「パネル」をポップアップします。これは、クロージャがローカル変数を参照できるにもかかわらず、呼び出し元のオブジェクトの存在によって状況が少し微妙になるためです。クロージャーが呼び出されるとき (このパネルのクリック イベントが発生するとき)、ここでは jQuery オブジェクト con を参照します。匿名関数の this.id = "content" は、匿名関数自体に対して実行される操作です。 this が参照する 2 つは、同じオブジェクトを参照していません。
イベント ハンドラーでこの値にアクセスしたい場合は、いくつかの変更を加える必要があります:
$(function(){
var con = $("div#panel");
this.id = "content" ;
var self = this;
con.click(function(){
alert(self.id);//content
});
});
このように、イベント処理関数に保存するのは this ではなく、外部ローカル変数 self への参照です。このテクニックには多くの実際的な応用例があり、次の章で詳しく説明します。他の命令型言語での「クロージャ」の説明や、実際のプロジェクトでのクロージャの適用など、クロージャについては第 9 章で詳しく説明します。
添付: 私のレベルが限られているため、記事に省略や誤りがあることは避けられません。また、文言自体が不適切である可能性もあります。タイムリーな修正や提案を歓迎します。この記事は他の人たちにインスピレーションを与えるためのものです、皆さんに感謝します!