面试官:来手写一个防抖和节流吧。
我:…
防抖,顾名思义,防止抖动,以免把一次事件误认为多次,敲键盘就是一个每天都会接触到的防抖操作。
想要了解一个概念,必先了解概念所应用的场景。在 JS 这个世界中,有哪些防抖的场景呢
代码如下,可以看出来防抖重在清零 clearTimeout(timer)
原理:每当触发时,清除上一个定时器,不管是否已经执行。
function debounce (f, wait) {
let timer
return (...args) => {
clearTimeout(timer)
timer = setTimeout(() => {
f(...args)
}, wait)
}
}
节流,顾名思义,控制水的流量。控制事件发生的频率,如控制为1s发生一次,甚至1分钟发生一次。与服务端(server)及网关(gateway)控制的限流 (Rate Limit) 类似。
scroll
事件,每隔一秒计算一次位置信息等代码如下,可以看出来节流重在加锁 timer=timeout
原理:触发时,如果有定时器已经触发了,就返回。直到下一个周期时间段。
function throttle (f, wait) {
let timer
return (...args) => {
if (timer) { return }
timer = setTimeout(() => {
f(...args)
timer = null
}, wait)
}
}
代码实现重在清零 clearTimeout
。防抖可以比作等电梯,只要有一个人进来,就需要再等一会儿。业务场景有避免登录按钮多次点击的重复提交。timer=timeout; timer=null
。节流可以比作过红绿灯,每等一个红灯时间就可以过一批。