再談javascript中的閉包

最近在看書學習的過程當中,又碰到了閉包這個知識點,發現本身對於閉包的理解錯了。javascript

 

仍是先看一段代碼,清晰地展現了閉包:java

function foo(){
	var a =2;
	function bar(){
		console.log(a);
	}
	return bar;
}
var baz = foo();
baz(); 		//2   這就是閉包

解釋:函數bar()的詞法做用域可以訪問到foo()的內部做用域,而後咱們將函數bar()自己當作一個值類型進行傳遞出去了,在foo()執行後,其返回值(就是函數baz())複製給了變量baz並調用了baz(),實際上就是執行了內部函數bar(),可是函數bar()是在本身定義的詞法做用域以外的地方執行了。閉包

在一般的狀況下,函數foo()在執行完以後,整個內部做用域都會被垃圾回收機制回收並銷燬的,可是由於閉包的存在,foo()的內部做用域並無被銷燬,由於函數bar()自己在使用內部做用域並持有對該做用域的引用,這個引用就是閉包了。異步

 

再來看看閉包的代碼:函數

function foo(){
	var a =2;
	function baz(){
		console.log(a);		//2
	}
	bar(baz);
}

function bar(fn){
	fn();	//我就是閉包啦
}

也能夠間接地傳遞:學習

var fn;
function foo(){
	var a =2;
	function bar(){
		console.log(a);
	}
	fn = bar;
}

function baz(){
	fn(); 	//我就是閉包啦
}

foo();
baz();	//2

 

閉包的做用?spa

函數是能夠記住並訪問被定義時所在的詞法做用域的,當函數在詞法做用域以外執行的時候,這時就產生了閉包。blog

當理解了這個概念,再回頭看我寫過的代碼,就很容易發現閉包的影子,包括:定時器、事件監聽器、AJAX請求或者其餘異步任務中,只要是用了回調函數,實際上都是在使用閉包。事件

 

以上是我對閉包的一些淺見,若有錯誤歡迎你們指出:)ip

 

參考資料:《你不知道的JavaScript》

相關文章
相關標籤/搜索