什麼是閉包?
MDN給出的官方回答是「閉包是由函數以及建立該函數的詞法環境組合而成。這個環境包含了這個閉包建立時所能訪問的全部局部變量」閉包
看代碼函數
//一個函數裏面包含了另外一個函數,最後已返回值返回被包裹的的函數。 function func() { let a = 1; function closer(){ console.log(a) } return closer } let b = func() b() // 1
按照正常的js做用域,當func執行完後a已經被銷燬,可是變量b仍然可以訪問到它裏面的變量。
這就是閉包的核心。當函數執行完後,被做爲返回值函數保留在了做用域中。以致於裏面的數據沒有被銷燬,仍然能夠訪問到。
閉包還有一個做用是模擬私有方法和變量。要知道,js是不支持定義私有方法和變量的。
經過這個類做爲對象返回私有方法和屬性,即可以保證它們只能夠被Create所調用。性能
function Create(){ var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { changeBy(-1); }, value: function() { return privateCounter; } } }
閉包的缺點
由上文可知閉包的做用能夠使數據保存在內存中。當濫用閉包,也會致使內存佔用過多,影響性能code
解決閉包的問題
當你已經肯定某些數據不會再被調用時,能夠把閉包刪除或者設爲null對象
總結
當一個函數可以記住並訪問到其所在的詞法做用域及做用域鏈,特別強調是在其定義的做用域外進行的訪問,此時該函數和其上層執行上下文共同構成閉包內存