说说对闭包的理解
闭包是什么
内层函数引用了外层函数作用域中的变量,导致外层函数执行完之后,它的作用域仍然存在,被内层函数引用的变量没有被垃圾回收处理,而是仍然存在于内存中,这就形成了一个闭包。
闭包解决了什么问题
- 在函数外部可以拿到函数内部的变量的值。
- 可以让变量的值始终保持在内存中,不会在函数调用后被清除。
闭包有什么应用场景
- 输出连续数字
for(var i=1;i<=10;i++){ ((j)=> { setTimeout(function() { console.log(j) // 输出1-10 }, 1000) })(i) } // 声明了10个立即执行函数,保存当次循环的值到内部
这是在ES6之前的方法,在ES6之后可以选择直接用let声明变量,就可以不用闭包了。(为什么用let声明可以达到这个效果呢,详见在for循环中,用let和用var声明循环变量的区别)
- 模拟私有变量
在Javascript中没有私有变量的定义方式,可以用闭包来模拟
function counter(){
var privateParam = 0
function changeBy(val) {
privateParam += val
}
return {
increment: function(){changeBy(1)},
decrement: function(){changeBy(-1)},
value: function(){return privateParam},
}
}
var doCounter = counter()
doCounter.val() //0
doCounter.increment() //1
doCounter.increment() //2
doCounter.decrement() //1
闭包有什么缺点
1. 使变量在内存中一直存在得不到释放,消耗内存,影响页面性能。解决方法是在函数退出之前,将变量删除。
2. 在函数外部可以修改函数内部的变量,使得变量的变化不好追溯。
参考资料: