JS-閉包(closure)的理解
可能很多人在剛學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; //釋放記憶體
相關文章
- JS閉包ClosureJS
- JS中的 閉包(Closure)JS
- javascript中的閉包closure詳解JavaScript
- python closure閉包 lambda表示式Python
- 理解“閉包”
- js閉包的理解JS
- PHP 閉包的理解PHP
- 理解Javascript的閉包JavaScript
- 理解 JavaScript 中的閉包JavaScript
- 對javascript閉包的理解JavaScript
- Golang中閉包的理解Golang
- 對JS閉包的理解JS
- 理解JavaScript 閉包JavaScript
- Groovy閉包理解
- javascript閉包的個人理解JavaScript
- 理解C#中的閉包C#
- 【譯】理解Rust中的閉包Rust
- 深入理解swift的閉包Swift
- [譯]理解JS中的閉包JS
- 深入理解閉包
- 閉包的理解-from my own opinion
- 理解Python函式閉包Python函式
- 深入理解JS閉包JS
- 用“揹包”去理解Go語言中的閉包Go
- 面試:對javascript的閉包的理解面試JavaScript
- 閉包函式(匿名函式)的理解函式
- 面試題:如何理解閉包面試題
- python閉包 - 理解與應用Python
- [Python小記] 通俗的理解閉包 閉包能幫我們做什麼?Python
- 【閉包概念】關於閉包概念不同解讀——你可以自己理解。
- 談談我對js中閉包的理解JS
- 【譯】理解JavaScript閉包——新手指南JavaScript
- 徹底理解閉包實現原理
- Dart 進階 | 深入理解 Function & ClosureDartFunction
- [譯]理解閉包中的記憶體洩漏記憶體
- 簡單而清楚地理解閉包
- 深入理解javascript系列(七):閉包(1)JavaScript
- 深入理解javascript系列(八):閉包(2)JavaScript