1.定義
? ? 官方對閉包的定義為:一個擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個函數(shù)),因而這些變量也是該表達(dá)式的一部分救拉。
? ? 簡單的說,就是js允許函數(shù)內(nèi)部定義函數(shù)或函數(shù)表達(dá)式瘫拣,并且這些內(nèi)部的函數(shù)可以訪問它所在的函數(shù)中的所有變量亿絮,參數(shù)和其他函數(shù)。當(dāng)這些內(nèi)部函數(shù)被它所在的函數(shù)之外的函數(shù)所引用時麸拄,就會形成閉包派昧。
? ? 如下代碼,函數(shù)outer返回一個函數(shù)拢切,closure引用了outer函數(shù)返回結(jié)果蒂萎,那么closure就形成了閉包。同理淮椰,通過其它方式五慈,將outer內(nèi)部的函數(shù)引用到外部,也會形成閉包主穗。
2.作用
?閉包在實(shí)際開發(fā)中的作用泻拦,總結(jié)出如下幾點(diǎn):
1. 緩存
? ? 對于一些處理過程很耗時的函數(shù),每次調(diào)用都會影響程序的性能黔牵,我們可以通過閉包的保存函數(shù)變量的特點(diǎn),將函數(shù)的計(jì)算結(jié)果緩存起來爷肝,每次調(diào)用時猾浦,緩存中有則從緩存中取陆错,沒有再調(diào)用。如下代碼:
2. 實(shí)現(xiàn)公有變量
? ? 如下代碼中的累加器金赦,我們可以將result當(dāng)做公有變量來訪問:
3. 實(shí)現(xiàn)封裝音瓷,屬性私有化
? ? 如下代碼,封裝了person中的name屬性夹抗,只能通過get和set方法訪問:
4. 模塊化開發(fā)绳慎,防止污染全局變量