JavaScript備忘錄-閉包(2)

來源:互聯網
上載者:User

標籤:

閉包的定義

閉包是指函數有自由獨立的變數。換句話說,定義在閉包中的函數可以“記憶”它建立時候的環境。

閉包的淺顯理解

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.