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-閉包JS
- JS閉包ClosureJS
- PHP 閉包(Closure)PHP
- Javascript閉包(Closure)JavaScript
- JS中的 閉包(Closure)JS
- 學習Javascript閉包(Closure)JavaScript
- javascript中的閉包closure詳解JavaScript
- 閉包捕捉(closure capture)淺析APT
- Java中的閉包(Closure)和回撥Java
- python closure閉包 lambda表示式Python
- 深入淺出JavaScript之閉包(Closure)JavaScript
- [正兒八經PHP]PHP閉包(Closure)初探PHP
- 理解“閉包”
- 理解閉包
- PHP 閉包的理解PHP
- 理解Javascript的閉包JavaScript
- js閉包的理解JS
- 理解JavaScript 閉包JavaScript
- Groovy閉包理解
- 理解 JavaScript 閉包JavaScript
- 對JS閉包的理解JS
- 對javascript閉包的理解JavaScript
- javascript閉包的個人理解JavaScript
- Golang中閉包的理解Golang
- 理解 JavaScript 中的閉包JavaScript
- 深入理解閉包
- 深入理解swift的閉包Swift
- [譯]理解JS中的閉包JS
- 理解C#中的閉包C#
- 【譯】理解Rust中的閉包Rust
- 深入理解javascript原型和閉包(15)——閉包JavaScript原型
- 面試:對javascript的閉包的理解面試JavaScript
- JavaScript變數作用域(Variable Scope)和閉包(closure)的基礎知識JavaScript變數
- 閉包的理解-from my own opinion
- 徹底理解js中的閉包JS
- javascript閉包的理解和例項JavaScript
- 深入理解JS閉包JS
- 面試題:如何理解閉包面試題