闭包是个啥?
一句话:函数内部的函数;
既然是函数内部的函数,那肯定能读取函数内部的变量了;
这个变量只能在当前的作用域读取,有私有变量的属性,
那就是有减少全局变量污染的功效了。
举个栗子:
function outer(){
var a=1;//定义一个内部变量
return function(){
return a;//返回a的变量值
}
}
var b= outer();
console.log(b());//输出1
怎么产生一个闭包呢?
上面提到函数内部的函数......
那么在一个函数内部创建另一个函数就产生一个闭包了。是不是so easy!
//栗子来了
functinon func(){
var a=1,b=2;
function closure(){//闭包
return a+b;//返回a+b的值
}
return closure;//返回闭包函数值
}
闭包的作用域链包含着它自己的作用域,以及包含它的作用域和全局作用域
闭包的缺陷
函数的作用域及其所有变量都会在执行结束后被销毁,但是在创建了一个
闭包后,这个函数的作用域就会一直保存到闭包不存在为止(一直在内存中,
会造成内存泄漏)。
//那我们就得释放他
function adderFunc(x){
return function(y){
retrun x+y;
}
}
var adder1=adderFunc(2);
var adder2=adderFunc(5);
console.log(adder1(2))//4
console.log(adder2(2))//7
adder1=null;
adder2=null;
总结
优点:
- 逻辑连续,当闭包作为另一个函数调用的参数时,
避免你脱离当前逻辑而单独编写额外逻辑。 - 方便调用上下文的局部变量。
- 加强封装性,从第2点的延伸,可以达到对变量的保护作用。
缺点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
网友评论