Javascript設計模式(二)——閉包

來源:互聯網
上載者:User

       引言

      本來應該是第二章,介面,但因為閉包實在不懂,所以先看看閉包

     

      本文

      閉包的概念:

        閉包是一個擁有許多變數和綁定了這些變數的環境的運算式(通常是一個函數),因而這些變數也是該運算式的一部分。

      最常見的閉包   

      

    function a() {
       var i=0;
      return function(){
        alert(i++);
      } 
     }
     var b=a();
     for(var i=0;i<3;i++){
      b();
     }

 

     解釋上面代碼前,先接受一個函數的建立和執行過程

     第一步:定義函數,設定環境,建立範圍鏈(scope chain)現a為全域變數,則a的範圍鏈中只有window

     第二步:執行a, 首先建立範圍(a.scope=a),然後建立使用中的物件(callObject),並將callObject放入a的範圍鏈的頂端,因此a的範圍鏈中含有兩個對象(a和window)

     第三步:在使用中的物件上添加一個arguments屬性,儲存調用a時的參數值

     第四步:將形參和內部變數賦值到使用中的物件a上

     javascriptGC原理:如果一個對象不再被引用,那麼這個對象會被GC回收。如果兩個對象無幹擾的互相引用,那麼這兩個對象也會被回收。

     總結:

     1、首先定義a時,建立了a的範圍鏈(scope chain)

     2、(var b=a())執行a時,建立範圍a.scope=a,並建立callObject對象添加a的範圍中

     3、a對象上添加了arguments屬性,並將i和return函數賦值給使用中的物件

     4、執行a時將b指向了a的ruturn函數值,在b中又引用的a中的局部變數i,因此不符合GC的回收標準,使用中的物件a沒有被回收,因此b訪問i是第一次訪問的對象,並且只有在b中才能訪問

 

  

   

    

聯繫我們

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