javascript闭包小结

                                                                           返回主页

关于闭包

  1. 闭包就是能够读取其他函数内部变量的函数,可以简单理解为“定义在一个函数内部的函数”。
  2. 闭包本质上是将函数内外连起来的桥梁。

代码1.1

function f1(){
        var n=999;
        function f2(){
      alert(n); 
    }
    return f2;
}
var result=f1();
result(); // 999

对于上述代码而言,result()运行结果为999.原因是:函数f2被f1包括在内部,此时,f1内部所有局部变量对f2是可见的,反之不成立。


此处表现出来的,即javascript中的链式作用域

链式作用域: 子对象会一级一级向上寻找所有父对象变量,因此,父对象所有变量对象对子对象可见。

闭包的作用

  1. 可以读取函数内部的变量
  2. 让这些变量值始终在内存中

接下来对闭包作用进行一个讲解


代码1.2

function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000 
  1. 对于上述代码,f1是f2的父函数,而f2会被赋值给一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1.因此f1也始终在内存中,不会被垃圾回收机制(GC)回收.
  2. 注意此处的nAdd.首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

闭包的优点

  1. 希望一个变量长期驻守在内存中可以使用闭包;
  2. 避免全局变量污染;
  3. 私有成员的存在。

闭包的注意之处:闭包会使得变量始终留在内存之中,如果不当使用,会增大内存的消耗。

代码1.3(区别于局部变量)

function abc(){
    var a = 1;
    a++;
    alert(a);
}
abc();                       //2
abc();                    //2

此处a为局部变量,因此每次进行a++都是在函数内部进行,a的生存周期局限在abc()内部。执行完毕便会销毁

参考资料:阮一峰的博客 javascript高级程序设计