手写防抖与节流

147 阅读1分钟

防抖(防止抖动)

举个栗子:回城有倒计时(回城被打断)

当被对手攻击,回城时间又要重新倒计时(非规律性)

实现如下:

const debounce=(fn,delay)=>{
    let timer = null  
    return (...args)=>{
        if(timer){window.clearTimeout(timer)}  //打断回城
        timer = setTimeout(()=>{
            fn.call(undefined,...args)
            timer=null
            },delay)
        }
	
}

const fn = debounce(()=>console.log('呜呜呜,终于回城啦'),3000)
fn()

应用场景:鼠标滑动事件

节流 (控制流量)

执行一次要等待一段时间才会再次执行。

举个栗子:施法有冷却时间(技能冷冻)

当玩家发功之后得等待一段时间之后才能再次发功。(具有规律性)

实现如下:

const throttle=(fn,delay)=>{
    let isCooling = false   // 是否冷却
    return ()=>{
        if(isCooling) return
        fn.apply(undefined)
        isCooling = true
        setTimeout(()=>{
           isCooling = false
          },delay)
	}
}

const fn = throttle(()=>console.log('又能发动技能了'),3000)
fn() // 打印 又能发动技能了
fn() // 技能冷却中

应用场景:埋点场景。比如说滚动到一定的高度发送埋点请求