標籤:
閉包的定義
閉包是指函數有自由獨立的變數。換句話說,定義在閉包中的函數可以“記憶”它建立時候的環境。
閉包的淺顯理解
function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName;}var myFunc = makeFunc();myFunc();
這段代碼看起來彆扭卻能正常運行。通常,函數中的局部變數僅在函數的執行期間可用。一旦 makeFunc() 執行過後,我們會很合理的認為 name 變數將不再可用。雖然代碼啟動並執行沒問題,但實際並不是這樣的。
這個謎題的答案是 myFunc 變成一個 閉包 了。 閉包是一種特殊的對象。它由兩部分構成:函數,以及建立該函數的環境。環境由閉包建立時在範圍中的任何局部變數組成。在我們的例子中,myFunc 是一個閉包,由 displayName 函數和閉包建立時存在的 "Mozilla" 字串形成。
為了更好滴理解這句話,簡單的看:
閉包可以實現私人變數。
function Animal(type) { var data = []; data[‘type‘] = type; this.getType = function () { return data[‘type‘]; }}var fluffy = new Animal(‘dog‘);fluffy.getType(); // 返回 ‘dog‘
在這個例子中,Animal類中建立了一個本地數組data。當 Animal對象被執行個體化時,傳遞了一個type的值並將該值放置在data數組中。因為它是私人的,所以該值無法被覆蓋(Animal函數定義了它的範圍)。一旦對象被執行個體化了,讀取type值的唯一方式是調用getType方法。因為getType是在Animal中定義的,因此憑藉Animal產生的閉包,getType可以進到data中。這樣的話,雖可以讀到對象的類型卻無法改變。這有點類似C#中的擁有私人的set訪問器並通過建構函式來實現注入的屬性。從這個意義上來講,javascript的函數就是閉包。
閉包的作用
簡單地來說就是圍繞著它的定義來的:
1.可以儲存獨立的變數。因為是閉包的內建函式的範圍只是存在於函數的內部,所以可以保證變數的安全。
2.定義在閉包中的函數可以“記憶”它建立時候的環境。通俗的講就是當閉包中的函數被賦值給閉包外部的變數的時候,它的引用就指向了外部的臨時變數。只要這種參考關聯性一直存在,閉包建立時的環境就會被儲存起來。 就能間接保持原建構函式體當時用到的臨時變數值。
JavaScript備忘錄-閉包(2)