1.什么是闭包?闭包的特点是什么?
闭包是一个函数,不过这个函数是声明在另外一个函数内部的,可以读取另外一个函数内部的变量。闭包其实非常常见,只不过可能我们很少意识到,这就是闭包。
闭包最大的特点就是可以记住自己的诞生环境,无论在何处调用,访问的都是声明时作用域的变量,可以访问到父函数中的变量,比如:
function fn1() {
var b=234;
function fn2() {
console.log(b);
}
return fn2;
}
var fn2=fn1();
fn2();//234
此时,fn2
就是一个闭包函数,由于js中的作用域是词法作用域,即函数的作用域是由函数的声明位置确定的,所以fn2
在fn1
中声明的时候,它的作用域和作用域链就确定了,当fn2
执行时,创建执行环境时,会根据作用域链向上逐级查找变量,最终在fn1
中找到变量b,这就是为什么在外部调用fn2
时,能够输出fn1
中b
的值,也是为什么说闭包函数可以记住自己的诞生环境。
2.闭包函数的注意点
一般函数在执行完成后,其中的变量没有再被使用,内存就会被回收,
但是在闭包函数中,由于全局中的fn2
一直被引用,所以fn1
也不会被回收,变量b
也会留在内存中。
因此,为了避免这种内存不被回收的问题,我们在使用完闭包函数fn2
之后,要将闭包函数置空,切断引用关系,以实现回收fn1
内存的目的
fn2=null;
此外,还有这一点值得注意的是,闭包函数的形成具有两个特点,一是声明在另一个函数内部,二是需要使用父函数的变量,二者缺一不可,所以
function foo(){
return function sub(){
}
}
以上并没有形成闭包,因为没有满足闭包形成的第二个条件。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。