JS-閉包(closure)的理解

Li-Jiacong發表於2018-10-13

可能很多人在剛學js的時候都會聽說過閉包,但是卻完全不瞭解閉包是什麼,當然我也在其中,其實閉包大量的存在在我們的程式碼中。我們缺少的是去識別閉包,擁抱閉包的思維。

!!!我們缺少的是根據自己的意願來識別、擁抱和影響閉包的思維(劃重點)

!!!閉包並不是什麼高大上的技術

閉包是基於詞法作用域書寫程式碼時產生的自然結果,其實我們一直在很自然地在建立閉包
不信你看

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

簡單吧,你是不是寫過很多次類似的程式碼,但是你卻沒有發現原來這就是閉包?

閉包的定義

當函式可以記住並訪問所有在詞法作用域時,就產生了閉包,即使函式是在當前詞法作用域之外執行。

在上面的栗子中,bar()依然持有對foo()內部作用域的引用,而這個引用就叫做閉包
如果覺得這樣理解起來有點拗口,那可以這樣理解——“閉包是定義在一個函式內部的函式”(百度百科給出的定義);不過我個人覺得這個定義有點狹隘了;

其實我們平時使用的很多回撥函式,實際上都是在使用閉包!回頭看看自己的程式碼,結合上面給出的定義,想想是不是這麼一回事呢。

現在在回到本文開頭看看劃重點的地方,是不是突然恍然大悟了

ps: 函式的執行上下文,在執行完畢之後,生命週期結束,那麼該函式的執行上下文就會失去引用。其佔用的記憶體空間很快就會被垃圾回收器釋放。可是閉包的存在,會阻止這一過程。所以我們呼叫baz()之後並且以後不再呼叫時,最好要釋放掉佔用的記憶體空間。

function foo(){
	var a = 2;
	function bar(){
		console.log(a);
	}
	return bar;
}
var baz = foo();
baz();	//2——這就是閉包的效果
baz = null;	//釋放記憶體

相關文章