閉包是什麼
示例:
function counter() {
var n = 0;
return function() {
return n++;
}
}
var c1 = counter();
c1();
上面示例中counter執行時返回一個函數對象,該函數對象訪問了局部變量n,構成了一個執行的封閉體。
閉包由兩個要素構成:函數對象以及作用域鏈(封閉的變量空間)
之前進行流行一句話是程序是由算法與數據構成的,閉包中的算法爲函數對象,數據爲作用域鏈(可訪問的變量,外部局部變量等);而對象中算法爲方法,數據爲成員變量。即閉包是函數對象爲主題,封裝了變量環境;而面向對象爲數據爲主題,封裝了方法。都達到了算法加數據的結構。
上例使用對象實現爲:
var counter = {
n: 0;
next: function() {
return n++;
}
}
counter.next();
因此閉包與對象屬於一個事物的正反面,可以使用閉包實現的都可以使用對象實現。