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.