什么是閉包?
閉包:如果一個函數(shù)使用了它范圍外的變量姓言,那么 這個函數(shù)+這個變量 就是閉包瞬项。
這函數(shù) 最后 輸出的 是 'Mozilla'。 init()創(chuàng)建了 一個 name 和一個 函數(shù)名為 displayName()的函數(shù)何荚。
displayName()是定義在 函數(shù)內(nèi)部的函數(shù)滥壕,僅在該函數(shù)體可用。displayName()?內(nèi)沒有自己的局部變量兽泣,然而它可以訪問到外部函數(shù)的變量绎橘,所以?displayName()可以使用父函數(shù)?init()?中聲明的變量name?。但是唠倦,如果有同名變量name?在displayName()?中被定義称鳞,則會使用?displayName()?中定義的?name?。
閉包的用途
閉包可以用在許多地方稠鼻,主要用途冈止。
一是前面提到的 可以讀取函數(shù)內(nèi)部的變量,另一個就是讓這些變量的值始終保存在內(nèi)存中候齿,不會在init()調(diào)用后被自動清除熙暴。
為什么會這樣呢闺属?原因在于init()是 displayName()的父函數(shù),而displayName()賦給的全局變量周霉,這導(dǎo)致displayName()始終在內(nèi)存中掂器,而displayName()的存在依賴于init(),因此init()也始終在內(nèi)存中俱箱,不會在調(diào)用結(jié)束后国瓮,被垃圾回收機制回收。
不必要的閉包 只會徒增內(nèi)存狞谱,可能會造成瀏覽器性能問題乃摹。解決方法是,在退出函數(shù)之前跟衅,將不使用的局部變量全部刪除孵睬。另外,閉包在jQuery中的應(yīng)用非常多伶跷。
閉包可以封裝私有變量
我們可以把函數(shù)當(dāng)作一個范圍肪康,函數(shù)內(nèi)部的變量就是私有變量,在外部無法引用撩穿,但是我們可以通過閉包的特點來訪問私有變量磷支。