JavaScript进阶(四)防抖

236 阅读2分钟

这是我参与8月更文挑战的第二十五天,活动详情查看:8月更文挑战

JavaScript进阶

JavaScript进阶(二)

JavaScript进阶(三)模块化

防抖

在我们日常开发中,尤其在一些需要和用户实现大量且频繁的交互的时候,肯定会遇到用户频繁点击,导致接口报错,这个时候我们就需要对其做一些优化了,通常这种情况都是通过防抖来实现的。

那防抖是什么呢?

  • 简单点就是,用户在一定时间内多次点击触发一个事件时,只会执行最后一次。

代码实现

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

好了,防抖的介绍的差不多了,相信对你日后的开发肯定会起到一定作用的。 今天就到这里了。还是那句老话书读百遍其义自见,相信自己加油。

大家,再见,我是Augus,一个爱瞎搞的软件开发工程师。

END~~~