概念:當一個函數的返回值是另外一個函數,而返回值的那個函數若是調用了其父函數內部的變量,且返回的這個函數在外部被執行就產生了閉包。閉包
閉包是一個環境,具體指的就是外部函數--高階函數。函數
說的通俗一點就是一個環境,可以讀取其餘函數內部的變量。spa
本質上,閉包是將函數內部和函數外部鏈接起來的橋樑。對象
用處:1·讀取內部函數的變量;
內存
2·這些變量的值始終會保持在內存中,不會在外層函數調用後被自動清除變量
優勢:1·變量會一直在內存中;垃圾回收
2·避免全局變量的污染;引用
3·私有變量的存在;內存泄露
特性:1·函數嵌套函數;co
2·內部函數能夠直接使用外部函數的局部變量;
3·變量或參數不會被垃圾回收機制回收 GC;
補充一下垃圾回收機制:
在Js中,若是一個對象再也不被引用,那麼這個對象就會被GC回收。若是兩個對象互相引用,而再也不被第3者所引用,那麼這兩個互相引用的對象也會被回收。由於函數a被b引用,b又被a外的c引用,這就是爲何函數a執行後不會被回收的緣由。
缺點:變量長期儲存在內存中,會增大內存的使用量 使用不當會形成內存泄露
判斷閉包的3個特色:
1·函數嵌套函數;
2·內部函數必定操做了外部函數的局部變量;
3·外部函數必定將內部函數返回到外部並保存在一個全局變量中;
判斷閉包的執行結果:
1·外部函數被調用了幾回就有幾個受保護的局部變量的副本;
2·來自一個閉包的函數被調用幾回,受保護的局部變量就變化幾回;