javascript防抖和节流

121 阅读1分钟

一. 学习实践防抖

任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行;在触发点击事件后,如果用户再次点击了,我们会清空之前的定时器,重新生成一个定时器。也就是当持续触发某事件时,一定时间间隔内没有再触发事件时,事件处理函数才会执行一次,如果设定的时间间隔到来之前,又一次触发了事件,就重新开始延时。


const debounce = (func, time, ctx, immediate) => {
    let timer
    const rtn = (...params) => {
        clearTimeout(timer)
        if (immediate) {
            // 频繁点击的时候及清空之前的计时;重新开始计时
            let callNow = !timer
            timer = setTimeout(() => {
                timer = null
            }, time)
            if (callNow) func.apply(ctx, params)
        } else {
            timer = setTimeout(() => {
            func.apply(ctx, params)
            }, time)
        }
    }
    return rtn
}  

二 函数节流

当持续触发scroll事件或者其他事件时,并不立即执行,而是有规律的每隔一个时间间隔执行一次时间处理函数


export const Throttle = (fn, t) => {
    let last
    let timer
    let interval = t || 500
    return function () {
        let args = arguments
        let now = +new Date()
        if (last && now - last < interval) {
            clearTimeout(timer)
            timer = setTimeout(() => {
            last = now
            fn.apply(this, args)
            }, interval)
        } else {
            last = now
            fn.apply(this, args)
        }
    }
}

节流和防抖都是用来优化性能的,它们都可以用于mousemove,scroll,resize,input等事件,他们的区别在于防抖只会在连续的事件周期结束时执行一次,而节流会在事件周期内按间隔时间有规律的执行多次。