閉包是什么

以前聽說過閉包也簡單的了解過,一直以為閉包就是可以將函數作為對象或參數使用。
最近看書又看到關于這塊的概念發現并非如此,所以就較真詳細了解了一下閉包的概念。
有一些編程語言(如: 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)閉包會在父函數外部,改變父函數內部變量的值。所以,一定要小心,不要隨便改變父函數內部變量的值。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 大家好,我是IT修真院成都分院第6期的學員,一枚正直純潔善良的前端程序員。今天給大家帶來的是閉包是什么,用處如何?...
    lx2487閱讀 374評論 0 1
  • 大家好,我是IT修真院深圳分院第01期學員,一枚正直善良的web程序員。 今天給大家分享一下,修真院官網 JS任務...
    長天_閱讀 423評論 0 2
  • 大家好,我是IT修真院北京分院25期的學員,一枚正直純潔善良的web前端程序員 今天給大家分享一下,修真院官網js...
    be684ac78b0c閱讀 278評論 0 0
  • 大家好,我是IT修真院北京分院22期的學員,一枚正直純潔善良的web前端程序員 今天給大家分享一下,修真院官網js...
    古碑先生閱讀 337評論 0 0
  • 有一只蛙,它的生活環境很奇特,生活在燥熱的沙漠之中。 它幾乎不說話,每天像悶油瓶似的閑逛。仙人掌說它“你不應該生活...
    思茲念茲閱讀 227評論 0 1