js防抖函数的使用

JavaScript028

js防抖函数的使用,第1张

function debounce(func, delay) {

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方法,把内部的方法返回出去,下次自己执行,以后有时间我再写一下闭包吧,所以我还留下一个问题,这样会不会造成内存泄漏?