什么是闭包
- JS中,函数会产生闭包;闭包是函数本身和该函数声明时所处的环境状态的组合。
- 函数能够“记忆住”其定义时所处的环境,即使函数不再其定义的环境中被调用,也能访问定义时所处环境的变量;
- 在JS中,每次创建函数时都会创建闭包;
- 但,闭包特性往往需要将函数“换一个地方”执行,才能被观察出来;
- 闭包允许我们将数据与操作该数据的函数关联起来。
// 创建一个函数
function fun() {
// 定义一个局部变量
var name = '哈哈哈';
function innerfun() {
alert(name);
}
// 返回一个局部函数
return innerfun;
}
// 调用外部函数,就能得到内部函数,用变量inn来接收内部函数innerfun()
var inn = fun();
// 执行inn函数,就相当于在fun函数的外部,执行了内部函数
inn();
功能:记忆性、模拟私有变量;
记忆性
当闭包产生时,函数所处环境的状态会始终保持在内存中,不会在外层函数调用后被自动清除。
function createCheckTemp(standardTemp) {
function checkTemp(n) {
if (n <= standardTemp) {
alert('你的体温正常');
} else {
alert('你的体温偏高');
}
}
return checkTemp;
}
// 创建一个checkTemp函数, 它以37.1度为标准线
var checkTemp_A = createCheckTemp(37.1);
// 再创建一个checkTemp函数, 它以37.3度为标准线
var checkTemp_B = createCheckTemp(37.3);
checkTemp_A(37.2);
checkTemp_B(37.2);
checkTemp_A(37.0);
checkTemp_B(37.8);
模拟私有变量
// 封装一个函数,这个函数的功能就是私有化变量
function fun() {
// 定义一个局部变量a
var a = 0;
return {
getA: function(){
return a;
},
add: function(){
a++;
},
pow: function(){
a *= 2;
}
};
}
var obj = fun();
// 如果想在fun函数外面使用变量a,唯一的方法就是调用getA()方法
console.log(obj.getA());
obj.add();
obj.add();
obj.add();
console.log(obj.getA());
obj.pow();
console.log(obj.getA());
使用闭包的注意点
不能滥用闭包,否则会造成网页的性能问题,严重时可能导致内存泄漏。所谓内存泄漏是指程序中已动态分配的内存由于某种原因未释放或无法释放;