最近在看書學習的過程當中,又碰到了閉包這個知識點,發現本身對於閉包的理解錯了。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》