理解js中的闭包
1.概念
闭包函数:声明在一个函数中的函数,叫做闭包
闭包:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回
2.特点
让外部访问函数内部变量成为可能;
局部变量会常驻扎在内存中;
可以避免使用全局变量,防止全局变量污染;
会造成内存泄露
3.闭包的创建
闭包就是可以创建一个独立的环境,每个闭包里面的环境都是独立的,互不干扰.闭包会发生内存泄露,每次外部函数执行的时候,外部函数的引用地址不同,都会创建一个新的地址,但凡是当前活动对象中有被内部子集引用的数据,那么这个时候,这个数据不删除,保留一根针给内部活动对象
闭包内存泄露为:key = value,key 被删除了value 常驻扎内存中;局部变量闭包升级版 ==> 自由变量
4.闭包的应用场景
例如 1
function funA(){
var a = 10; // funA的活动对象之中;
return function(){ //匿名函数的活动对象;
alert(a);
}
}
var b = funA();
b(); //10
例如2
function outerFn(){
var i = 0;
function innerFn(){
i++;
console.log(i);
}
return innerFn;
}
var inner = outerFn(); //每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址
inner();
inner();
inner();
var inner2 = outerFn();
inner2();
inner2();
inner2(); //1 2 3 1 2 3
例如3
var i = 0;
function outerFn(){
function innnerFn(){
i++;
console.log(i);
}
return innnerFn;
}
var inner1 = outerFn();
var inner2 = outerFn();
inner1();
inner2();
inner1();
inner2(); //1 2 3 4
例如4
function fn(){
var a = 3;
return function(){
return ++a;
}
}
alert(fn()()); //4
alert(fn()()); //4
闭包的好处与坏处
我们先看好处
1.保护函数内的变量的安全,实现封装,防止变量流入其他环境发生命名的冲突
2.在内存中维持一个变量,可以做缓存
3.匿名自执行函数可以减少内存的消耗
坏处
1.其中一点上面已经有体现了,就是被引用的私有的变量不能被销毁,增大了内存的消耗,造成内存泄露,解决方案是可以
在使用完变量后手动为他赋值为null
2.其由于闭包涉及跨域访问,所以会导致性能损失,我们可以通常把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响