JavaScript 的闭包

通常情况下, 求和函数的定义是这样的

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&lt;=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.
由此可知闭包保留的是变量, 而不是变量的值.
如果一定要引用循环变量, 记得创建一个变量用于保存现场

闭包可以用于实现装饰器

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×