什么是闭包?通俗的说闭包是指能读取其他函数内部的函数。这句话又是什么意思呢?我们来看个例子
function a(){ var i=0; function b(){ alert(++i); } return b; } var c=a(); c();
这段代码定义了一个函数a,在函数a的内部嵌套了另一个函数b,而这个函数a又返回函数b,在函数a的外部我们定义了一个变量c,这个变量c表面上指向的是函数a,但是根据函数a的结构可看出变量c实际上指向的是函数b。
这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。这是对闭包作用的非常直白的描述,不专业也不严谨,但大概意思就是这样,理解闭包需要循序渐进的过程。
在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。
那 么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。
时间: 2024-11-06 07:52:57