代码改变世界

深入闭包

2012-07-09 13:48  江苏黑马  阅读(472)  评论(1)    收藏  举报
  1. 什么是闭包?
    现在有三个函数。a()、b()和c()。如果满足一下条件则构成闭包。
    (1)函数b嵌套在函数a内部;
    (2)函数a返回函数b。
    当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
  2. 闭包的作用?
    闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源。
    在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。
    示例代码:
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>闭包</title>
    <script>
       function a(){
          var i=0;
          function b(){
            alert(++i);
          }
          return b;
          /*return ++i;*/
        }
        var c = a();    
    </script>
    </head>
    
    <body>
    <input type="button" value="click" onClick="c();">
    </body>
    </html>

    运行后每点击一次按钮,返回从0开始每次加一的数值。

    若是把b函数去掉,添加return ++i;则程序会报错:c不存在。这是因为前面定义的c已经被回收了。这就是垃圾回收机制。
  3. 闭包的应用场景。
    (1)保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
    (2)在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
    以上两点是闭包最基本的应用场景,很多经典案例都源于此。
  4. 更为详细深入理解:http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html