閉包する学習ノート
4276 ワード
function eg3(){
var n = 9;
var f2 = function(){
alert(n);
};
return f2;
};
eg3()();
//
function eg3(){
var n = 9;
var f2 = function(){
alert(n);
};
return f2();
};
eg3();
原理:Javascript言語特有の「連鎖作用領域」構造は、サブオブジェクトが1段階ずつ上に向かってすべての親オブジェクトの変数を探します.したがって、親オブジェクトのすべての変数は、子オブジェクトに対しては見えますが、逆は成立しません. function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
f 1はf 2の親関数であり、f 2はグローバル変数を与えられ、f 2は常にメモリにあり、f 2の存在はf 1に依存しているため、f 1も常にメモリにあり、呼び出しが終了した後、ゴミ回収メカニズムによって回収されることはない.nAddが相当して一つのsetterがあります.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
4)キャッシュ:処理に時間がかかる関数オブジェクトがあるので、計算された値を記憶しておく必要があります.この関数を呼び出した場合、まずキャッシュで検索します.見つけられない場合は、計算してキャッシュを更新し、値を返します.見つけたら、直接に検索した値を返してもいいです.この点は、外部からの参照を解放しないので、関数内部の値を保持することができます.
参考資料:http://www.jb51.net/article/57259.htm http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.