防抖策略(debounce)是当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则重新计时。
好处: 能够保证用户在频繁触发某些事件的时候,不会频繁的执行回调,只会被执行一次
实现步骤
function debounce(fn, delay) {
let timer = null//形成一个闭包
return function() {
clearTimeout(timer)//如果设置了时间,则清除前面设置的时间,然后重新开始计时
timer = setTimeout(() => fn(), delay)
}
}
节流策略(throttle),顾名思义,可以减少一段时间内事件的触发频率控制事件发生的频率,如控制为1s发生一次,甚至1分钟发生一次。
实现步骤
利用闭包记录前一次执行的时间
使用定时器写法,delay毫秒后第一次执行,第二次事件停止触发后依然会再一次执行
function throttle1(fn, delay){
let flag = true
return (...args)=>{
if(flag){
flag = false
setTimeout(() => {
fn(...args)
}, delay);
flag = true
}
}
}
使用时间戳写法,事件会立即执行,停止触发后没有办法再次执行
function throttle2(fn,delay){
let oldtime = Date.now()
return function(...args){
let newtime = Date.now()
if(newtime-oldtime > delay){
fn(...args)
oldtime = newtime
}
}
}
相同点:
防抖和节流都是为了阻止操作高频触发,从而浪费性能。
不同点:
防抖是让你多次触发,只生效最后一次。适用于只需要一次触发生效的场景。
节流是让你的操作,每隔一段时间触发一次。适用于多次触发要多次生效的场景。