10 閉包(讀書筆記)

閉包
閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的常見方式,就是在一個函數內部創建另一個函數。


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,其所佔用的內存永遠不會被銷燬。

發佈了1 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章