結果は次のようになります:
未定義
デフォルト
ジャック
クロージャのもう 1 つの重要な用途は、オブジェクトをオブジェクト指向で実装することです。従来のオブジェクト言語は、異なるオブジェクト (クラスのインスタンス) が互いに干渉することなく独立したメンバーと状態を持つようにするためのクラス テンプレート メカニズムを提供します。 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 章で詳しく説明します。
添付: 私のレベルが限られているため、記事に省略や誤りがあることは避けられません。また、文言自体が不適切である可能性もあります。タイムリーな修正や提案を歓迎します。この記事は他の人たちにインスピレーションを与えるためのものです、皆さんに感謝します!