一、闭包是什么
当通过调用外部函数返回的内部函数后,即使外部函数已经执行结束了,但是被内部函数引用的外部函数的变量依然会保存在内存中,我们把引用了其他函数作用域变量的函数和这些被引用变量的集合,称为闭包
来个例子:
function outerFunction() {
let outerVariable = '我在outer函数里!';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
const innerFunc = outerFunction();
innerFunc(); // 输出: 我在outer函数里!
二、闭包有什么优缺点
优点:
- 访问其他函数内部变量
- 变量长期驻扎在内存中,不会被内存回收机制回收,即延长变量的生命周期
- 避免定义全局变量所造成的污染
缺点:
- 常驻内存,会增大内存的使用量 ,使用不当会造成内存泄露
三、闭包常用的场景
1.封装私有变量
function createCounter() {
let count = 0;
return {
increment: function() {
count++;
return count;
},
decrement: function() {
count--;
return count;
}
};
}
const counter = createCounter();
console.log(counter.increment()); // 输出: 1
console.log(counter.increment()); // 输出: 2
console.log(counter.decrement()); // 输出: 1
2.用做缓存
function foo(){
var myName ='张三'
let test1 = 1
const test2 = 2
var innerBar={
getName: function(){
console.log(test1);
return myName
},
setName:function(newName){
myName = newName
}
}
return innerBar
}
var bar = foo()
console.log(bar.getName()); //输出:1 张三
bar.setName('李四')
console.log(bar.getName()); //输出:1 李四