/** * 防抖函数 * @author jaylen * @param fn 需要执行的方法 * @param delay 延迟时间 * @param immediate 是否立马执行 * @returns 防抖函数 */ export const debounce = any>( fn: T, delay: number, immediate = false ) => { let timer: ReturnType | null = null let isInvoke = false const _debounce = function (thisArg: any, ...args: Parameters) { if (timer) clearTimeout(timer) if (immediate && !isInvoke) { fn.apply(thisArg, args) isInvoke = true } else { timer = setTimeout(() => { fn.apply(thisArg, args) isInvoke = false }, delay) } } // 取消防抖 _debounce.cancel = function () { if (timer) clearTimeout(timer) timer = null isInvoke = false } return _debounce }