正文
閉包的概念:
閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
最常見的閉包
復制代碼 代碼如下:
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中才能訪問