闭包是什么意思,我查过Javascript的解释,发现定义看的迷迷糊糊:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

刚开始的时候对这个定义的理解实在不懂,后来慢慢应用上才明白,我的理解就是,闭包的表现形式是一个function嵌套一个function,而外层function的返回就是内层的function,当外界调用外层函数而获得内层函数时,就算是一个闭包。当然这种说法仅限于我自己的理解,而真正的运作原理涉及一些概念,如作用链域,GC回收和函数嵌套等。比如下面这个例子。

function a() {
    var i = 0;
    function b() {
        i++;
    }
    return b;
}
var c = a();

当第一次调用c的时候,i的值是1,而再调用c的时候,i的值却是2了,成功实现了i的自增。这里就要先说明一下作用链域。

作用链域是指一个function里某个变量的查找过程,如上例,b在被调用时变量i会先在b自身内寻找,未能找到则向其父function寻找,这时成功在a里找到了i,然后进行i++。假如a里也没找到,则会向window寻找,若还未找到,则返回undefined,这样一个寻找方向就是作用域链。

当c被构造时,a返回了内部函数b,并赋给c,此时a执行完毕,当GC进行回收时,发现a的内部有东西被外界调用,此时便无法回收临时变量i。当c每次执行时,就是b再执行,b寻找i的值,发现可以找到,便i++。所以可见,闭包就是将需要的资源存放保护起来,不随着函数执行完毕而回收。

由此可以看出闭包的一些特点,它保护了函数中临时变量的安全,只有函数内部才可以调用相应临时变量。在内存中i一直存在,直到相应外界调用的对象被销毁。

假如我们再次执行c = a()会怎么样呢,我们会发现,i又从0开始了。因为这相当于重新生成了a对象。