JavaScript闭包(closure)
前言
看到closure后,一开始感觉很高大上,更多的是想去了解它的应用场合。
内容
定义部分
指有权访问另一个函数作用域中的变量的函数,创建闭包的方法就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。
特点
1、函数结构体为嵌套函数;
2、函数内部可以引用外部的参数和变量;
3、参数和变量不会被GC回收;
4、常驻内存,增大内存使用量,使用不当很容易造成内存泄露;
普通闭包
<script>
function test(){
var a=1;
//匿名函数
return function(){
alert(a++);
};
};
var fun=test();//JavaScript变量和函数转换,
fun();// this result is 1;
fun();// this result is 2;
//由于闭包会使变量始终保存在内存中,如果不当使用会增大内存消耗,手动释放内存;
fun = null;//变量a被GC回收
</script><span style="color:#0D0D0D;background:white"></span>
注意:将写好的闭包函数返回值赋值为另一个变量,方便调用,如果直接调用闭包函数,有时候会调用不成功(自己亲测)。
从上面的例子可以看出,由于闭包中的参数和变量不会被垃圾回收机制回收,变量值为最后一次运行变量值。相当于变量a只被初始化了一次,有点静态变量循环取值有点类似,如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//变量被关键字static修饰
for (int i=0;i<10;i++)
{
static int a=1;
a++
console.write(a);
}</span> 输出结果为:0,1,2,3,4,5,6,7,8,9
此处有静态变量关键字static修饰变量的时候,只初始化一次。
- 平时我们在写JavaScript函数的时候,当变量a为全局变量进行累加时:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//实现全局变量累加
<script>
var a=1;
function test(){
a++;
alert(a);
}
test();//this result is 2
test();//this result is 3
test();//this result is 4
</script></span>
- 当a为局部变量时:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//当a变为局部变量
<script>
function test(){
var a=1;
a++;
alert(a);
}
test();//this result is 2
test();//this result is 2
</script></span>
- 利用闭包实现局部变量累加:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><script>
function test(){
var x=10;
//匿名函数
return function(){
x++;
alert(x);
}
}
test();//this result is 11
test();//this result is 12
</script></span>
- 私有成员存在的闭包:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//私有成员的存在
<script>
var test=(function(){
var a=1;
function bbb(){
a++;
alert(a);
} function ccc(){
a++;
alert(a);
} return{
b:bbb, //返回结果为JSON(键值对)结构
c:ccc
}
})();
test.b();//this result is 2
test.c();//this result is 3
</script></span>小结
上面那样使用的好处:
1、采用匿名函数,防止造成全局变量污染;
2、利用闭包,实现了一个变量长期驻扎在内存中;
3、私有成员的存在
感谢您的宝贵时间······
浙公网安备 33010602011771号