/**
* 防抖函数,函数连续调⽤时,时间间隔必须⼤于或等于 wait,func才会执⾏
* @param {function} func:回调函数
* @param {number} wait:时间间隔,默认值 48
* @param {boolean} immediate:是否⽴即调⽤函数,true为立即执行,默认值为true
* @return {function} 返回调⽤函数的结果
*/
function debounce(func, wait = 48, immediate = true) {
let timer, context, args
// 定义延迟执⾏函数
const later = () => setTimeout(() => {
// 延迟函数执⾏完毕,清空缓存的定时器
timer = null
// 延迟执⾏的情况下,函数会在延迟函数中执⾏
if (!immediate) {
func.apply(context, args)
context = args = null
}
}, wait)
// 这⾥返回是每次实际调⽤的函数
return function (...params) {
// 如果是否创建延迟执⾏函数(later),没有就重新创建
if (!timer) {
timer = later()
// 如果是⽴即执⾏,就调⽤函数
if (immediate) {
func.apply(this, params)
} else {
context = this
args = params
}
// 如果已有延迟执⾏函数(later),调⽤的时候清除原来的并重新设定
// 这样做延迟函数会重新计时
} else {
clearTimeout(timer)
timer = later()
}
}
}
评论