以前聽說過閉包也簡單的了解過,一直以為閉包就是可以將函數作為對象或參數使用。
最近看書又看到關于這塊的概念發現并非如此,所以就較真詳細了解了一下閉包的概念。
有一些編程語言(如: javascrpt)中提供了函數對象的概念,有些人包括我認為這個就叫做閉包,其實這是不準確的。
- 概念
下面我查詢了解了一下閉包的概念
1、閉包是指函數有自由獨立的變量。換句話說,定義在閉包中的函數可以“記憶”它創建時候的環境。
2、在函數對象中,將局部變量及其環境封閉起來的結構被稱為閉包。
-
代碼
例如如下js代碼:function extent() { var n=0; return function() { n++; console.log("n="+n); } } f =extent(); f(); //n的值為1 f(); //n的值為2
如上代碼,將帶有 n 這個變量和環境封閉起來并可以供外部使用的結構就是閉包。
Ruby中的閉包
其實在ruby中我們經常使用閉包,例如如下
sum = 0
10.times{|n| sum += n}
print sum
10.times 表示調用對象10的 times 方法,緊跟在這個調用后面的大括號里面的部分就是Block。Block 實際上就是匿名函數,它可以被調用,可以捕獲上下文。因此上面的代碼已經使用了閉包。應用場景
1、保護函數內的變量安全。以最開始的JS為例,函數extent中n只有通過函數f才能訪問,而無法通過其他途徑訪問到,因此保護了n的安全性。
2、在內存中維持一個變量。如上JS,由于閉包,函數extent中n的一直存在于內存中,因此每次執行f(),都會給n自加1。使用閉包的注意點
1)由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成性能問題
2)閉包會在父函數外部,改變父函數內部變量的值。所以,一定要小心,不要隨便改變父函數內部變量的值。