JavaScript物件導向程式設計(7): 閉包

來源:互聯網
上載者:User

 本部落格轉載於:http://devbean.javaeye.com/blog/409566

閉包這個概念看上去很深奧,這個詞在離散數學裡面的意思確實比較難於理解。在這裡,我們先可以把閉包理解成是一種匿名函數或者匿名類。

1. 什麼是閉包?

什麼是閉包?一種正式的解釋是:所謂閉包,指的是一種擁有很多變數並且綁定了這些變數的環境的運算式(通常是一個函數),因而這些變數也是這個運算式的一部分。

相信很多人都不會理解這個定義,因為他的學術味道太濃了——或許你喜歡從字面的文法上進行分析:首先,它是一個運算式,這個運算式綁定了很多變數以及這些變數的環境。不過這並沒有什麼意義,這依然不會告訴我們什麼是閉包。

那麼,來看一個例子:

Js代碼

function add(a) {<br /> return function(b) {<br /> return a + b;<br /> };<br />}<br />var func = add(10);<br />alert(func(20));

我想經過了前面有關函數的描述,這個例子應該很清楚的理解。JavaScript裡面的函數就是對象,他可以做對象能做的一切事情——我們首先定義了一個函數add,它接受一個參數,這個函數返回一個匿名函數,這個匿名函數也接受一個參數,並且會返回這個參數同外部函數的那個參數的和。因此在我們使用的時候,我們將add返回的匿名函數賦值給func,然後調用func,就返回了這兩個數的和。

當我們建立一個這樣的函數,這個函數內部的一個變數能夠在函數外面被引用時,我們就稱建立了一個閉包。仔細的品味一下:這就是那個閉包的定義。

看看我們的代碼:首先,它有一個內部變數,就是那個匿名函數;其次,這個函數將匿名函數返回了出去,以便外面的變數可以引用到內部定義的變數。

2. 閉包的作用

閉包有什麼用呢?或許現在還看不出來,那麼看看這段代碼:

Js代碼

function inc(a) {<br /> var i = 0;<br /> return function() {<br /> return i;<br /> };<br />}<br />var num = inc();<br />alert(num());

本來,這個變數 i 在函數外面是訪問不到的,因為它是 var 定義的,一旦跳出範圍,這個變數就被記憶體回收了,但是,由於我們使用了閉包,在外面是能夠訪問到這個變數的,因此它並不被記憶體回收!

如果還是不明白閉包的作用,那麼看一段應該很熟悉的代碼:

Js代碼

function Person() {<br /> var id;<br /> this.getId = function() {<br /> return id;<br /> }<br /> this.setId = function(newId) {<br /> id = newId;<br /> }<br />}<br />var p = new Person();<br />p.setId(1000);<br />alert(p.getId()); // 1000<br />alert(p.id); // undefined

我們定義一個類Person,它有一個id屬性。現在這個屬性的行為很像是私人變數——只能通過 setter 和 getter 函數訪問到。沒錯,這就是閉包的一個用途:製造類的私人變數!

閉包還有一個作用:在記憶體中維護一個變數,不讓記憶體回收行程回收這個變數。這裡的例子就不再舉出了。

這裡我們只是簡單的說了JavaScript的閉包的概念,並沒有涉及閉包的記憶體模型等等之類。這是一個相當重要的概念,Java社區中的部分成員一直對閉包夢寐以求,C#也已經在最新版本中添加了閉包的概念,只不過在那裡稱為lambda運算式。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.