防抖
1、非立即执行版
function debounce(fn,time=250,context){
let timer=null
return function(...args){
const self=context||this
if(timer){
clearTimeout(timer)// 每次执行的时候把前一个 setTimeout clear 掉
}
timer=setTimeout(()=>{
fn.apply(self,args)
timer=null
},time)
}
}
2、立即执行版
// 防抖动函数-立即执行版
function debounce(func, delay) {
let timer;
return function () {
let context = this;
if (timer) clearTimeout(timer); // 每次执行的时候把前一个 setTimeout clear 掉
let callNow = !timer;
timer = setTimeout(() => {
timer = null;
}, delay)
if (callNow) func.apply(context, arguments);
}
}
3、双剑合璧版
/**
* @desc 函数防抖
* @param func 函数
* @param wait 延迟执行毫秒数
* @param immediate true 表立即执行,false 表非立即执行
*/
function debounce(func, delay, immediate) {
// 双剑合璧版
let timer;
return function () {
let context = this;
if (timer) clearTimeout(timer);
if (immediate) {
let callNow = !timer;
timer = setTimeout(() => {
timer = null;
}, delay)
if (callNow) func.apply(context, arguments);
} else {
timer = setTimeout(() => {
func.apply(context, arguments);
}, delay)
}
}
}
节流
1、时间戳版
function throttle(fn, time = 250,context) {
let lastTime = null;
return function (...args) {
const self=context||this
const now = Date.now(); //当前时间
if (!lasttime||now - lastTime >= time) {
fn.apply(self,args);//帮助执行函数,改变上下文
lastTime = now;
}
};
}
2、定时器版
function throttle(func, wait) {
// 定时器版
let timer;
return function () {
let context = this;
if (!timer) {
timer = setTimeout(() => {
timer = null;
func.apply(context, arguments)
}, wait)
}
}
}