防抖(防止抖动)
举个栗子:回城有倒计时(回城被打断)
当被对手攻击,回城时间又要重新倒计时(非规律性)
实现如下:
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() // 技能冷却中
应用场景:埋点场景。比如说滚动到一定的高度发送埋点请求