天天看點

js 閉包 小結

        剛參加工作時就聽到js閉包這個東東。诶,這是個啥東西?聽上去很高大上而又神秘莫測!後來斷斷續續在網上查過多次,好多相關的文章感覺大部分都是copy copy copy 再copy!總之最後還是模模糊糊,不是很明了。

        好了,說正事。前段時間工作中需要自己寫前端,寫了幾個js插件後突然對閉包有了清晰的認識。現在有時間總結一下。

        其實閉包很簡單。要想出現閉包,首先js要有一塊封閉的代碼區域。所謂封閉的代碼區域,就很常見了 一個方法、一個代碼塊 、一個對象等都可看做封閉的代碼區域。然後,在這個封閉的區域以外 調用封閉區域内的方法,或者引用 封閉區域内的對象時,這個封閉的區域就是一個閉包啦。空口無憑來上張圖吧。

js 閉包 小結

圖中的stepGuide(右邊紅框内Closure(閉包)内)為一個jQuery自定義擴充元件(封閉代碼區域),jump為此元件的一個内部方法(已經設定為元件執行個體方法,即外部通過執行個體可以調用),而此斷點的調用場景為:stepGuide.jump(1) 。即形成了外部程式調用封閉區域内的方法,此時浏覽器就将stepGuide視為一個閉包了。

那麼閉包有什麼好處?為什要用閉包? 閉包最大的好處就是可以起到資料隔離的作用。典型的使用場景就是可以避免大量使用全局變量,使用過多的全局變量容易産生沖突、混亂,且代碼可讀性差。而使用閉包内部變量,隻能在閉包内部操作或者使用閉包内的方法操作,不會與外界産生沖突,也就不會出現全局變量的困擾。可以簡單的把閉包内的成員了解成是java中 private修飾的成員。

當然閉包有利也有弊。因為閉包的成員被外部程式引用,是以浏覽器會在記憶體中儲存閉包的現場環境不釋放。如果亂用閉包而不适時的銷毀相關的引用,則可能導緻系統記憶體占用過高。勢必影響js性能,嚴重的可能直接導緻浏覽器崩潰。是以能夠恰當的使用閉包才是王道。

以上個人見解勿噴,歡迎各路大佬指導讨論。