“防抖”(Debouncing)是一种在前端开发等领域广泛应用的技术,核心目的是过滤掉高频、无意义的重复触发信号,只保留 “有效” 触发,避免资源浪费或功能异常。

防抖的本质是设置一个 “延迟时间(等待期)”,当事件被触发时:

  1. 先清除之前未执行的延迟任务(若存在);

  2. 重新设置一个新的延迟任务,等待延迟时间结束后再执行目标函数。

只有当事件在 “延迟时间内不再被触发”(即进入 “稳定状态”),目标函数才会真正执行。

简而言之,就是可以不断刷新,从头开始执行,类似于回城

在es6之前,防抖的写法

function deBounce(callback,time){
    var timer = null;
    return function() {
        if(timer) {
            clearTimeout(timer);
        }
        var args = arguments;//利用闭包保存arguments
        timer = setTimeout(function() {
            callback.apply(null,args);
        },time);
    }
}

优点是兼容性极佳,可在所有 JavaScript 环境中运行;无需担心 ES6 语法的转译问题,适合对兼容性要求极高的场景(如旧系统维护)。

缺点也很明显arguments 是类数组对象,使用数组方法需先转换,操作繁琐;语法较陈旧,不符合现代 JavaScript 开发习惯;在箭头函数中无法使用 arguments(不过此处返回的是普通函数,不受影响)。

es6之后的写法

function deBounce(callback, time) {
    let timer = null;
    return function (...args) {
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            callback.apply(null, args);
        }, time);
    };
}

缺点是兼容性受限,无法在不支持 ES6 的环境中使用;若需要兼容老旧浏览器,需通过 Babel 转译,可能增加代码体积。