防抖函数(简单版本)
/**
* 防抖(Debounce):
* 在事件被触发后,延迟 n 秒后才执行回调函数。
* 如果在这 n 秒内又被触发,则重新计时。
*
* 应用场景:
* - 搜索框输入:用户停止输入后才发送请求
* - 窗口 resize:窗口调整完成后才执行计算
* - 按钮点击:防止用户快速多次点击提交
*
* 效果:确保函数在连续触发事件结束后只执行一次
*/
const debounce = <T extends (...args: any[]) => any>(func: T, delay: number) => {
let timeoutId: NodeJS.Timeout | null = null
return (...args: Parameters<T>) => {
if (timeoutId) {
clearTimeout(timeoutId)
}
timeoutId = setTimeout(() => {
func(...args)
}, delay)
}
}
节流函数(简单版本)
/**
* 节流(Throttle):
* 在一定时间内,无论事件触发多少次,函数只执行一次。
* 即在指定时间间隔内,函数最多执行一次。
*
* 应用场景:
* - 滚动事件:页面滚动时限制处理频率
* - 鼠标移动:限制 mousemove 事件处理频率
* - 按钮点击:防止短时间内重复提交
* - 窗口 resize:限制调整窗口时的计算频率
*
* 效果:确保函数在持续触发事件期间按固定时间间隔执行
*
* 与防抖的区别:
* - 防抖:事件停止触发后才执行(最后一次)
* - 节流:事件持续触发时按间隔执行(多次)
*/
const throttle = <T extends (...args: any[]) => any>(func: T, delay: number) => {
let lastTime = 0
return (...args: Parameters<T>) => {
const now = Date.now()
if (now - lastTime >= delay) {
lastTime = now
func(...args)
}
}
}