js实现防抖(debounce)与节流(throttle)
防抖(debounce)
一句话概括:防抖是给定一个时间周期,如果触发事件的周期小于该时间(也就是触发过快),则不会触发事件。
举个例子:我给定的时间周期是1s,如果我在触发第一次事件后1s内触发该事件,则重新开始计时,直到触发周期大于1s才会执行事件的方法。
function debounce(fn,timeout){
let timer = null
return function(){
clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(window,arguments)
}, timeout);
}
}
节流(throttle)
一句话概括:节流是给定一个时间周期,然后对频率大的触发进行削峰,如果触发事件的周期大于该事件(也就是触发过快),则会将触发事件的周期限定在给定的周期内,如果小于则按照正常的时间触发。
举个例子:我给定的时间周期是1s,如果我在触发第一次事件后连续0.5s内触发该事件,那触发周期会变成每间隔1s执行事件。
function throttle(fn,timeout){
let flag = true
return function(){
if(flag){
setTimeout(() => {
fn.apply(this,arguments)
flag = true
}, timeout);
}
flag = false
}
}
其他应用场景举例
讲完了这两个技巧,下面介绍一下平时开发中常遇到的场景:
- 搜索框input事件,例如要支持输入实时搜索可以使用节流方案(间隔一段时间就必须查询相关内容),或者实现输入间隔大于某个值(如500ms),就当做用户输入完成,然后开始搜索,具体使用哪种方案要看业务需求。
- 页面resize事件,常见于需要做页面适配的时候。需要根据最终呈现的页面情况进行dom渲染(这种情形一般是使用防抖,因为只需要判断最后一次的变化情况)
第三方实现
如果自己不愿意封装,可以用第三方实现,比如lodash库
本文来自博客园,作者:shinebay,转载请注明原文链接:https://www.cnblogs.com/shinebay/p/17345692.html