1.什么是闭包?
(1) 闭包是有权访问另一个函数作用域变量的函数
(2) 闭包一般是函数嵌套,一个函数返回另外一个函数,内部函数访问外部函数的变量就形成了一个闭包
2.闭包有什么特性?
(1)封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法直接访问的;
(2)持久性:一般的函数调用完毕之后,系统自动注销函数,而闭包来说,在外部的函数被调用之后,闭包中的数据依然存在,从而实现对数据的持久使用。
3.闭包的优缺点是什么?
闭包的优点:
(1) 闭包的优点是可以私有化变量,将变量私有化到函数内部,并在私有化的基础上进行数据保持,减少全局变量;
(2) 闭包在防抖节流,函数柯里化;都应用里数据保持这个特性。
闭包的缺点:是容易造成内存泄露,因为闭包创建的变量会一直存在内存中,需要及时置空,否则会造成内存泄露,影响程序性能(垃圾回收机制)
4.闭包常见的应用场景是什么?
在防抖函数中,第一次点击的时候,我们会let一个time一个定时器,如果不采用闭包的话,下次触发函数会重新创建一个新的定时器,两个定时器的引用不同,是没有关联的,使用闭包可以直接在内存中找到之前创建的计时器,调用就可以直接拿到对应的定时器的时间
//防抖
function debounce() {
let timer;
//闭包
return function(){
cleaeTimeout(timer);
timer = setTimeout(() = > {
//需要防抖的操作
console.log('防抖成功')
},500);
}
}
要理解闭包,必须先理解JS特殊的变量作用域,JS的特殊之处,在于函数内部能够直接读取全局变量