最近在学js,学到闭包,有一点点没顺的过来,百度了一下,大致理解的一点点,现在就来记录一下。
js没有c++中class的public和private的区分(ES5中),只有全局变量和局部变量这两种,引入闭包就使得js有了私有变量这一概念。
下面给出闭包的定义:闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。调用完一次后,函数没有被释放,整条作用域链上的局部变量都将得到保留。
在本质上,闭包就是将函数内部和函数外部连接的一座桥梁。
写一个闭包的简单例子:
function test() {
var a = 1;
return function(){
alert(a++)
};
}
var fun = test();
fun();// 1 执行后 a++,,然后a还在
fun();// 2
闭包有什么好处呢?
1.希望一个变量长期驻扎在内存中
2.避免全局变量的污染
3.私有成员的存在
我们使用全局变量也可以实现同样的效果
var a = 1;
function abc(){
a++;
alert(a);
}
abc(); //2
abc(); //3
但是这样全局变量会变得很多很杂,对代码的书写不利
如果我们用局部变量来写的话 会遇到如下问题
function abc(){
var a = 1;
a++;
alert(a);
}
abc(); //2
abc(); //2
他的值没有递增
这时候我们就用到刚开始所说的闭包
function test() {
var a = 1;
return function(){
alert(a++)
};
}
var fun = test();
fun();// 1 执行后 a++,,然后a还在
fun();// 2
当然,也可以通过函数自调来实现
var fun = (function() {
var a = 1;
return function(){
return a++
};
})();
fun(); //1
fun(); //2
简单的说就是通过一个”()”来将这个声明变成一个表达式,然后通过()直接调用前面的表达式。自我调用函数只执行一次。设置a为 1。并返回函数表达式。
下面让我们举一个实例:
<script type="text/javascript">
function box(){
var age = 100;
return function(){ //匿名函数
age++;
return age;
};
}
var b = box();
alert(b()); //101
alert(b()); //102
alert(b()); //103
alert(b); // function () {
// age++;
// return age;
// }
b = null; //解除引用,等待垃圾回收
</script>
alert(b());相当于alert(box()()); 通过alert(b)我们可以看到b表示函数box()的内嵌function 所以b()也就是box()()调用了这个内嵌函数。
简单的说,在执行b()时,就自动在box()这个函数中在执行,并且执行完后,局部变量age并没有消失,而是依然存在着,所以再次b()后age得到了递增。
最后当我们不需要引用的时候直接b = null就可以了。