什么是闭包?
闭包:如果一个函数可以访问其外部函数的变量,它就是闭包。
举个例子:
outFn(name){
return function(){
console.log(name)
}
}
const fn = outFn("张三")//fn得到outFn的返回值,为一个匿名函数
fn()//调用匿名函数
//console.log("张三")
闭包原理
虽然outFn已经执行完毕,但是其活动对象OA也不会销毁,因为返回的匿名函数仍然引用着outFn函数中的变量,这就是闭包(匿名函数维护着一个作用域链,在它本身找不到name变量时,他会顺着它维护的作用域链往上找)
所以闭包使用过多,会占用较多的内存,这也是一个副作用,内存泄露。
怎么解决内存泄露的问题?
即在不使用闭包时,把被引用的变量设置为null,手动清楚变量,这样下次js垃圾回收机制回收时,就会把设为null的变量给回收了。像上面的代码:直接name=null
即可
闭包使用场景
- 防抖处理:
window.onresize = debounce(fn, wait)
function debounce(fn,wait) {
var timer = null
return function () {
if (timer) { //timer第一次执行后会保存在内存里
clearTimeout(timer)
timer = null
}
timer = setTimeout(function () {
fn()
}, wait)ssss
}
}
var fn = function () {
console.log('fn')
}
- 老提起的for循环(用let也可以解决)