私有变量可以用到闭包(变量声明时如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义)
本质:将函数内部和外部连接起来的桥梁
示例:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c=a();
c();
特点:
- 函数b嵌套在函数a内部;
- 函数a返回函数b。
这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,这是因为函数a外的变量c引用了函数a内的函数b。也就是说,当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
闭包是可访问上一层函数作用域里变量的函数,即便上一层函数已经关闭。
应用场景(函数作为返回值,函数作为参数传递):
- 保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
- 在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
回收机制:
在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。
使用注意点:
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
来源:
http://www.runoob.com/js/js-function-closures.html
https://baike.baidu.com/item/%E9%97%AD%E5%8C%85