let timer
//当前的this是指向window
return function (...args) {
//当前的this是指向dom元素
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() =>{
func.apply(this, args)
}, delay)
}
}
例:<div id="test">点击</div>
实现隔3s执行一次的操作:
document.getElementById('test').addEventListener('click', debounce(function() {
console.log('执行完成之后的动作')
}, 3000))
记:事件回调函数里的this指向触发当前事件的DOM元素
2022.3.19补充
节流函数的另一种实现方式:
两者的区别:
防抖函数:在一定时间内执行一个方法多次,只执行最后一次。因为在事件触发会先清理timer,如果时间间隔不到则会被清理掉,只有你的间隔到了之后才会执行,因此前面的函数都会被清理掉。
节流函数:在一定时间内执行一个方法多次,只有第一次生效。因为在事件触发后会先判断timer是否存在,只有不存在的时候才会执行。
相当于防抖是强制清理,节流是不到时间进不了大门。
在进行窗口的resize、scroll,输入框内容校验,防止按钮重复点击等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,体验糟糕。所以可以采用debounce(防抖)和throttle(节流)的方式来减少调用频率,同时又不影响实际效果。我们一起先来看看防抖和节流的区别
防抖函数 debounce
节流函数 throttle
如何调用
防抖和节流都利用了闭包,首先就调用了debounce和debounce方法,把内部的方法返回出去,下次自己执行,以后有时间我再写一下闭包吧,所以我还留下一个问题,这样会不会造成内存泄漏?