クロージャの定義は非常に曖昧です。クロージャとは、構文ドメインが特定の領域に位置し、外部の実行ドメイン内の非永続変数値を継続的に参照 (読み取りおよび書き込み) する機能を備えた段落を指します。エリア内の独自のスコープ。実行スコープの外にあるこれらの非永続変数は、クロージャが最初に定義された (または作成された) ときの値 (ディープリンク) を魔法のように保持します。簡単に言うと、クロージャは、上位レベルの関数またはスコープから取得した変数 (キーと値のペア) のコピーを別のスコープに保存します。これらのキーと値のペアは、上位レベルの関数の実行には従いません。完成したら。 Zhou Aimin氏は、クロージャは「属性テーブル」であり、クロージャはデータブロックであり、クロージャは「名前=値」を格納する比較テーブルであると、より明確に述べました。それはとても簡単です。ただし、クロージャは実行時の概念であることを強調しておく必要があります。
JavaScript のクロージャには 2 つの特徴があります:
関数変数への参照として - 関数が返されるときにアクティブ化されます。
クロージャは、関数が戻ったときにリソースを解放しないスタック領域です。
現在、認識されているクロージャ実装は 3 つあります:
with(obj){
//これがオブジェクト クロージャです
}
(function(){
//関数クロージャー
})()
try{
//...
} catch( e) {
//catch クロージャーですが IE にはありません
}
いくつかの便利な例
//**************** クロージャ uniqueID******** ********
uniqueID = (function(){ //この関数の呼び出しオブジェクトは値を保存します
var id = 0; //これはプライベート永続値です
//外側の関数は、アクセスできる永続値を返します。 ネストされた関数
//これは、変数 uniqueID に保存したネストされた関数です。 //Return, self。 -increment.
})() ; //定義後に外部関数を呼び出します。
document.writeln(uniqueID());
document.writeln(uniqueID()); //2
document.writeln(uniqueID()); //4
コードをコピー
コードは次のとおりです: //****** ************クロージャ階乗** ***********
var a = (function(n){
if(nif( n==1){ return 1; }
else{ return n * argument.callee(n-1); 4);
document.writeln(a);
コードをコピーします
コードは次のとおりです: function User(properties ) { //現在のインスタンスを指すように変数をここで宣言する必要があります
var objthis = this;
for ( var i inproperties ) {
(function(){
//クロージャの内部では、t は毎回 new であり、
var t = property[i] の場合、properties[i] の値が内部にあります。
objthis[ "get" i ] = function() {return t;};objthis[ "set" i ] = function(val) {t = val;})(); }
}
//テストコード
var user = new User({
名前: "ボブ",
年齢: 44
}); getname());
alert(user.getage());
alert(user.getage()); ));
user.setage( 22 );
alert ( user.getage());
が質問です今日、Wuyou で次のことを確認しました:
リクエスト:
これを 3 つのノードの Onclick イベントで、対応するパラメーターを正しくポップアップできます。
コードをコピー
コードは次のとおりです:
aa
aa ;li id="a3">aa
解決策:
関数クロージャーを使用します。
var lists = document.getElementsByTagName("li ");
for(var i=0,l=lists.length; i lists[i].onclick = (function(i){//外部関数に保存
return function(){
alert(i);
}
})(i)
}
コードをコピーします
コードは次のとおりです。 var lists = document.getElementsByTagName("li"); for(var i=0); ,l=リスト; i < l i ){
lists[i] = new function(){
return function(){
(t 1)
}
}
}
Situ Zhengmei による JavaScript クロージャー
コードをコピー
コードは次のとおりです。 var ul = document.getElementsByTagName( "ul")[0]; ul.onclick = function(){
var e = argument[0] ||
target = e.srcElement ?ターゲット;
if(target .nodeName.toLowerCase() == "li"){
alert(target.id.slice(-1))
}
}
Situ Zhengmei による JavaScript クロージャー