1.什么是闭包?
闭包的特点:
- 函数嵌套函数(内部函数、外部函数)
- 内部函数可以引用外部函数的参数或者变量
- 外部函数的参数或变量不会被js的垃圾回收机制收回
function aaa() {
var a = 1;
function bbb() {
alert(a);
}
return bbb;
}
var c = aaa();
c();
=>表达式形式
(function() {
var a = 1;
return function() {
alert(a);
}
})();
2.闭包有什么好处?
- 希望一个参数或变量长期驻扎在内存中(不会被外部函数的垃圾回收机制所回收)
- 避免全局变量的污染
- 实现私有成员的存在
function aaa() {
var a = 1;
a++;
alert(a);
}
aaa(); //2
aaa(); //2, 每次调用aaa(),a的值都从1开始,如果想每次调用aaa()实现a值得累加,怎么办呢?——闭包
=>function aaa() {
var a=1;
function bbb() {
a++;
alert(a);
}
return bbb;
}
var c= aaa();
c(); //2
c(); //3
c(); //4 因为aaa()被执行后,变量a未被垃圾回收机制收回,而是驻扎在内存中,所以每次执行bbb(),a值就会在内存值得基础上加1
3.闭包的用法?
- 代码的模块会,成员的私有化
var c= (function(){
var a=1;
function aaa() {
a++;
alert(a);
}
function bbb(){
a++;
alert(a);
}
return {
aa : aaa,
bb : bbb
}
})();
c.aa(); //2
c.bb(); //3
alert(a); //报错,因为a私有化成员
alert(aaa()); //报错
4.闭包在IE下容易引发内存泄漏
5.闭包的核心是对参数和变量的不会被js垃圾回收机制回收特性的利用。