廖雪峰《JavaScript教程》 閉包
http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143449934543461c9d5dfeeb848f5b72bd012e1113d15000
以下兩例均為教程中示例的引申。
例一:
var f1, a = [1, 2, 3, 4];
function lazy_sum(arr) {
return function() {
return arr.reduce(function(x, y) {
return x + y;
});
}
}
f1 = lazy_sum(a);
alert(f1()); //10
a[0] = 0;
alert(f1()); //9, not 10
閉包就是攜帶(綁定)狀態(tài)的函數(shù)。這個例子中,return 的閉包函數(shù)體中引用了外部函數(shù)級變量arr,它攜帶的狀態(tài)就是arr 所映射的實體,對于可變變量,更新數(shù)組a中元素,引起實體變化,閉包運行結(jié)果隨之變化。
例二:
function count1() {
var arr = [];
for (var i = 1; i <= 3; i ++) {
arr.push(function () {
return i * i;
});
}
return arr;
}
var arr1 = count1();
var f1 = arr1[0]
alert(f1()) //16
function count2() {
var arr = [];
for (let i = 1; i <= 3; i ++) {
arr.push(function () {
return i * i;
});
}
return arr;
}
var arr2 = count2();
var f2 = arr2[0]
alert(f2()) //1
function count3() {
var arr = [];
for (var i = 1; i <= 3; i ++) {
arr.push((function (i) {
return function () {
return i * i;
}
})(i));
}
return arr;
}
var arr3 = count3();
var f3 = arr3[0];
alert(f3()); //1
count1 中閉包綁定的i 是count1 的函數(shù)級變量。
count2 中閉包綁定的i 是塊級變量(let),每次塊結(jié)束這個變量就固定下來了。
count3 中閉包綁定的i 是閉包的上層函數(shù)的函數(shù)級變量,互不想干。