閉包
閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的常見方式,就是在一個函數內部創建另一個函數。
function createComparisonFunction(propertyName){
return function(obj1,obj2){
var value1 = obj1[propertyName];
var value2 = obj2[propertyName];
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0;
}
}
}
var compare = createComparisonFunction("name");
var result = compare({name:"Leon"},{name:"Dae"});
compare = null;
創建函數,這一步createComparisonFunction執行結束,但是返回一個內部的匿名函數,這個匿名函數持有createComparisonFunction的活動對象
var compare = createComparisonFunction("name");
調用函數,
var result = compare({name:"Leon"},{name:"Dae"});
//解除對匿名函數的引用
compare = null;
匿名函數從createComparisonFunction中返回後,它的作用域鏈被初始化爲包含createComparisonFunction函數的活動對象和全局變量對象,這樣匿名函數就能訪問所有createComparisonFunction中定義的變量,createComparisonFunction結束後,因爲匿名函數的作用域鏈仍然在引用這個活動對象因此createComparisonFunction的活動對象不會被銷燬,這個活動對象會存在內存中知道匿名函數被銷燬。
1.閉包與變量
閉包只能取得包含函數中任何變量的最後一個值
function createFunctions(){
var result = new Array;
for(var i=0;i<10;i++){
result[i] = function(){
return i;
}
}
return result;
}
var funcs = createFuctions();
for(var i=0;i<funs.length;i++){
alert(funcs[i]);
}
全部是10,因爲每個函數的作用域都保存着createFunctions的活動對象,所以它們引用的是同一個變量i,當createFunctions結束後,變量i的值是10.
2.this對象
this是在運行時基於函數的執行環境綁定的,在全局函數中,this等於window,當函數作爲某個對象的方法調用時,this等於那個對象,但匿名函數的執行環境具有全局性,因此this對象通常指向window。
var name = "The window";
var object ={
name:"MyObject",
getNameFunc:function{
return function(){
return this.name;
};
}
};
object.getNameFunc()();//The window
var name = "The window";
var object ={
name:"MyObject",
getNameFunc:function{
var that = this;
return function(){
return that.name;
};
}
};
object.getNameFunc()();//MyObject
3.內存泄露
function assignHandler(){
var element = document.getElementById(id);
element.onClick = function(){
alert(element.id);
};
}
由於匿名函數保存了對assighHandler的活動對象的引用因此只要匿名函數存在,element的引用數至少是1,其所佔用的內存永遠不會被銷燬。
10 閉包(讀書筆記)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.