function a () {
let timer
clearTimeout(timer)
timer = setTimeout(() => {
console.log(1111)
})
}
上面的代码每次调用的时候clearTimeout是没作用的,为什么呢?
是因为JS的执行机制的关系,JS每次调用函数都会创建函数执行上下文(函数作用域),当执行完毕时JS会自动回收空间销毁该函数执行上下文,所以每次执行函数的时候timer的内存储存地址是不一样的,相当于你每次执行函数都会创建定时器
function a () {
clearTimeout(a.timer)
a.timer = setTimeout(() => {
console.log(111)
},1000)
}
再看看上面的代码,这也是防抖的核心代码,也实最简单的防抖实现,a函数的储存地址是不会改变的,而a.timer的储存地址也不会改变,所以每次执行函数的时候都会把上一次的定时器关了,再重新开个新的定时器,而新的定时器又要重新等待1秒钟,这就是防抖的核心