什么是防抖和节流?

简介

虽然二者都有延迟当前动作的反馈,但是防抖的延迟时间是确定的,延迟周期内如果有新动作进入,旧的动作将会被取消。

而节流是提前设置了一个阀门,只有当阀门打开的时候,该动作才有机会执行。如果阀门是关闭的,那这个动作就不会进入执行区。个人理解防抖是后置的处理高频事件方式,而节流是前置处理。防抖机制隐含了一个优先级的概念,后到的先执行,因此事件的进入事件越晚优先级实则越高,而优先级最高的具备执行权,而进入时间这个准入条件是不由开发者提前预设的,事件的执行更加离散无规则。而缓冲机制并没有为事件分配权重,只是设置了一个均匀频率的信号量,该信号量的开启和关闭是决定能否进入执行区的条件,而与事件无关,准入条件是人为设置的,相对来说执行更规律。

带有立即执行的防抖实现

/**
 * 带有立即执行的防抖
 * @param {*} fn 
 * @param {*} wait 
 * @param {*} immediate 
 */
function debounce(fn, wait = 50, immediate = true) {
    let args
    let self
    let timer
    let delay = () => {
        return setTimeout(() => {
            timer = null
            if (!immediate) {
                fn.apply(self, args)
            }
        }, wait);
    }
    return function (...params) {
        if (!timer) {
            timer = delay()
            if (immediate) {
                fn.apply(this, params)
            } else {
                args = params
                self = this
            }
        } else {
            clearTimeout(timer)
            timer = delay()
        }
    }
}
debounce(()=>{console.log(1)},50,false)()

节流实现

const throttle=(fn, wait = 50)=>{
    let isCan=true
    return function(){
        if(!isCan) return
        isCan=false
        setTimeout(() => {
            fn.apply(this, arguments);
            isCan=true
        }, wait);
    }
}
let func = throttle(()=>{console.log(1)},1050)
func()
func()
posted @ 2020-09-06 11:11  浮云随笔  阅读(767)  评论(0编辑  收藏  举报