(1)什么是閉包:
閉包是指有權訪問另外一個函數(shù)作用域中的變量的函數(shù)以蕴。
閉包就是函數(shù)的局部變量集合糙麦,只是這些局部變量在函數(shù)返回后會繼續(xù)存在。閉包就是函數(shù)的“堆棿园梗”在函數(shù)返回后并不釋放赡磅,我們也可以理解為這些函數(shù)堆棧并不在棧上分配而是在堆上分配。當在一個函數(shù)內(nèi)定義另外一個函數(shù)就會產(chǎn)生閉包宝与。
(2)為什么要用:
匿名自執(zhí)行函數(shù):我們知道所有的變量焚廊,如果不加上 var 關鍵字冶匹,則默認的會添加到全局對象的屬性上去,這樣的臨時變量加入全局對象有很多壞處咆瘟,比如:別的函數(shù)可能誤用這些變量嚼隘;造成全局對象過于龐大,影響訪問速度(因為變量的取值是需要從原型鏈上遍歷的)袒餐。除了每次使用變量都是用 var 關鍵字外飞蛹,我們在實際情況下經(jīng)常遇到這樣一種情況,即有的函數(shù)只需要執(zhí)行一次匿乃,其內(nèi)部變量無需維護桩皿,可以用閉包。
結(jié)果緩存:我們開發(fā)中會碰到很多情況幢炸,設想我們有一個處理過程很耗時的函數(shù)對象泄隔,每次調(diào)用都會花費很長時間,那么我們就需要將計算出來的值存儲起來宛徊,當調(diào)用這個函數(shù)的時候佛嬉,首先在緩存中查找,如果找不到闸天,則進行計算暖呕,然后更新緩存并返回值,如果找到了苞氮,直接返回查找到的值即可湾揽。閉包正是可以做到這一點,因為它不會釋放外部的引用笼吟,從而函數(shù)內(nèi)部的值可以得以保留库物。