防抖和节流可以防止某一事件频繁触发,比如input输入后根据输入内容发送查询请求等。
函数防抖(debounce)
在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。
function debounce(fun,time){
let timer
return function(...args){
clearTimeout(timer)
timer=setTimeout(()=>{
fun.apply(this,args)
},time)
}
}
注意
return的function的参数用...剩余参数存储成数组,不然fun.apply的时候会出错
函数节流(throttle)
规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。
function throttle(fun,time){
let t1=0 //初始时间
return function(...args){
let t2=new Date() //当前时间
if(t2-t1>time){
fun.apply(this,args)
t1=t2
}
}
}
2.0版本
function throttle(fn, wait) {
let timer = null;
return function(...args) {
// 如果没有开启定时器,开启一个
if (!timer) {
timer = setTimeout(function () {
fn.apply(this,args)
// 执行完fn后将定时器timer清空
timer = null;
}, wait);
}
}
}