1.什么是闭包?
闭包就是能够读取其他函数内部变量的函数(也可以说是子函数访问父函数的局部变量),比如函数a里面一个函数b,b引用了a的变量,这就形成了一个闭包,比如:
function outer() {
var a=0;
return function inner() {
a++;
console.log(a)
}
}
var t1=outer();//打印1
下面这个会打印什么?
function outer() {
var a=0;
return function inner() {
a++;
console.log(a)
}
}
var t1=outer();
t1()//打印1
t1()//打印2
t1()//打印3
为什么?首先t1()是一个函数,开辟了一个内存单元,一共调用了三次outer函数,而a是outer函数的一个变量,这个变量在inner函数中被改变了,所以函数inner每执行一次a就在原来的基础上+1,因此outer函数中的a变量会一直保存在这个内存单元中。当然将var a=0放在outer函数外面,结果也是1,2,3;若将var a=0放在inner函数内部,那将会打印出1,1,1
function outer() {
var a=0;
return function inner() {
a++;
console.log(a)
}
}
var t1=outer();
var t2=outer();
var t3=outer();
t1()//打印1
t2()//打印1
t3()//打印1
为什么?因为t1、t2和t3是三个函数,这三个函数开辟了三个不同的内存单元,所以它们之间是相互独立的。但是若把a=0放在outer函数外面,就会打印出1,2,3,为什么呢?a在outer函数外面,虽然定义了三个函数,但可以理解为都是“内部”的,所以a也是在累加。
2.闭包的优缺点。
优点:减少全局变量的使用;减少传递函数的参数量;封装性;缺点:闭包会占用内存资源,过多使用会导致内存溢出。解决办法:把不需要但又不能被销毁的变量赋值为null,强行销毁。