通常情况下, 求和函数的定义是这样的
function sum(arr){
return arr.reduce(function(x,y){
return x+y;
});
}
sum([1,2,3,4,5]); //15
`</pre>
但是, 如果不需要立刻求和, 而是在后面的代码中根据需要进行计算, 可以选择返回一个保存了参数的求和函数
<pre>`function lazy_sum(arr){
var sum = function(){
return arr.reduce(function(x,y){
return x+y;
});
}
return sum;
}
`</pre>
当我们调用`f = lazy_sum()`时会返回保存了参数 arr 的 sum 函数, 直到通过 f()调用 sum 函数前都不会进行求和运算, 可以节约资源.
**需要注意的一点**是每一次调用 lazy_sum() 都会返回一个新的函数, 彼此相互独立, 各自占用内存空间
同时要注意, 尽管每次生成并返回的都是新的 sum 函数, 但是 lazy_sum() 的局部变量是通用的, 可参考**类方法**与**实例**的关系, 这是使用闭包的目的之一
**更要注意**:
<pre>`function count(){
var arr = [];
for(var i = 1; i<=3; i++){
arr.push(function(){
return i*i;
});
}
return arr;
}
var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
在这个例子中, f1(), f2(), f3()的返回值都是 16, 原因在于:
每一次循环都向 arr 推入一个(function(){})(i), 但都没有计算, 三次循环后 i 变成了 4, 所以 f1, f2, f3 的函数接受的局部变量的值都是 4.
由此可知闭包保留的是变量, 而不是变量的值.
如果一定要引用循环变量, 记得创建一个变量用于保存现场
闭包可以用于实现装饰器