JS-閉包(closure)的理解
阿新 • • 發佈:2018-11-22
可能很多人在剛學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; //釋放記憶體