话不多少,全在注释里了
直接上代码:
// 节流,表示的是在规定时间内,只是触发一次操作
// 那就分情况讨论,
// 有规定时间内,第一次触发
// 规定时间内,最后一次触发
// 规定时间内,第一次和最后一次都触发
// 使用时间戳实现,第一次被调用
function throttle(callBack, delay){
let pre = 0
return function(...args){
if(Date.now() - pre > delay){
pre = Date.new()
callBack.apply(this,args)
}
}
}
// 最后一次触发
function throttle(callBack,delay){
let timer = null
let flag = true
return function(...args){
if(flag){
flag = false
timer = setTimeout(()=>{
callBack.apply(this,...args)
flag = true
}, delay);
}else{
clearTimeout(timer)
}
}
}
// 方式二,优化,代码少
function(callBack, delay){
let timer = null
return function(...args){
if(!timer){
timer = setTimeout(function() {
timer = null
callBack.apply(this,args)
}, delay);
}
}
}
// 两种结合
function throttle(callBack, delay) {
let pre = 0;
let timer = null;
return function (...args) {
if (Date.now() - pre > delay) {
clearTimeout(timer);
timer = null;
pre = Date.now();
callBack.apply(this, args);
} else if (!timer) {
timer = setTimeout(() => {
callBack.apply(this, args);
}, delay);
}
}
}