/** * 防抖函数,函数连续调⽤时,时间间隔必须⼤于或等于 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() } }}
评论