什么是闭包
是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以由多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
函数嵌套形成的闭包,闭包包括函数本身以及它的外部作用域。使用闭包可以形成独立的空间,延长变量的声明周期,保存中间状态值。
闭包的优点:① 实现封装,减少全局变量命名冲突;②保存自己的私有变量;③可以读取函数内部的变量。
闭包的缺点:①内存泄漏:由于闭包会使得函数种的变量都被保存在内存种,内存消耗大,所以不能滥用闭包,否则会造成网页的性能泄漏问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
② 闭包在父函数外部,改变父函数内部变量的值。不要随意改变父函数内部的值。
1.缓存变量的值
function createInc(startValue){
let index = -1;
return (step) => {
startValue += step;
index ++;
return [index, startValue];
}
}
箭头函数中的index,startValue是外部变量。
2.闭包模拟私有方法
私有方法限制对代码的访问,而且可以用于管理全局变量命名,避免扰乱公共代码。
let Count = (function() {
let privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment:function(){
changeBy(1);
},
decrement:function(){
changeBy(-1);
},
value:function(){
return privateCounter;
}
}
})();