一次性弄懂debounce

debounce是啥?

debounce一般被称为防抖动函数,核心目的在于减少函数被触发的频率,从而提高性能。

使用场景

  • 减少resize、mousemove、 scroll等会频繁触发的事件执行次数。比如说我可以通过debounce做到resize结束后100ms才触发事件(因为我们可能不想resize事件被频繁触发,只需要窗口调整结束后再触发即可)
  • 减少ajax请求次数。比如说现在有个需求,要求实现一个用户输入信息的同时从数据库查询相关信息并在前台进行展示,那么很显然,如果直接绑定input事件的话在用户输入的过程中此事件会频繁触发从而导致在短时间内发送多次ajax,一方面会影响性能,另一方面可能会导致用户都输入4个查询关键字了第一次的查询才刚返回,这就会导致查询结果和用户输入不一致的情况,用户体验不好。这种情况其实也可以用debounce来加以解决,如果用户一直在输入就不触发ajax请求,等用户停止输入100ms后立即发送ajax请求。

总之,debounce可以用来控制某个函数被触发的频率,从而提高性能和用户体验

不同的debounce实现

若干时间后触发(事件连续发生时不触发,等到事件发生结束后若干时间才触发操作,比如说等用户调整窗口大小结束后200ms再打印日志)

function debounce(func, wait) {
    var timeout=null;

    return function () {
        var context = this;
        var args = arguments;

        if (timeout) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(function () {
            func.apply(context, args);
            clearTimeout(timeout);
            timeout=null;
        }, wait || 500);
    }
}

// 用户每次停止调整窗口大小200ms后打印日志
window.onresize=debounce(function(){
    console.log('hello world');
},200);
复制代码

立即触发(事件首次发生时触发,后续连续发生的话不触发事件)

function immediate(func, wait) {
    var flag = true;
    var timeout = null;

    return function () {
        if (flag) {
            flag = false;
            return func.apply(this, arguments);
        }

        if (timeout) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(function () {
            flag = true;
        }, wait);
    }
};

// 用户开始调整窗口大小时记录日志,后续连续触发的话不记录日志,隔一段时间后首次触发再次记录日志
window.onresize = immediate(function () {
    console.log('hello world');
}, 200);
复制代码

将延期执行和立即执行合并下(其实就是给debounce函数加个isImmediate参数,有参数的话就在动作发生后立即执行,否则就在动作连续执行后若干时间再执行)

function debounce(func, wait, isImmediate) {
    if (isImmediate) {
        return immediate(func, wait);
    } else {
        return delayDebounce(func,wait);
    }
}

function immediate(func, wait) {
    var flag = true;
    var timeout = null;

    return function () {
        if (flag) {
            flag = false;
            return func.apply(this, arguments);
        }

        if (timeout) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(function () {
            flag = true;
        }, wait);
    }
};

function delayDebounce(func, wait) {
    var timeout = null;

    return function () {
        var context = this;
        var args = arguments;

        if (timeout) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(function () {
            func.apply(context, args);
            clearTimeout(timeout);
            timeout = null;
        }, wait || 500);
    }
}

// 用户调整窗口后立即执行
window.onresize = debounce(function () {
    console.log('hello world');
}, 200, true);

// 用户调整窗口结束若干时间后执行
window.onresize = debounce(function () {
    console.log('hello world');
}, 200);
复制代码

结语

性能优化应该是每个热爱技术的宝宝绕不过的坎,所以,既然绕不过,那就在性能调优的深海里浪里个浪好啦,O(∩_∩)O哈哈~

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lodash是一个JavaScript工具库,提供了许多实用的函数和工具来简化JavaScript开发。其中之一是`debounce`函数,用于创建一个防抖函数。 防抖函数是指在一定时间内连续触发的事件只执行一次,常用于处理频繁触发的事件,比如浏览器窗口的resize事件、输入框的输入事件等。防抖函数可以避免频繁触发导致的性能问题。 在lodash中,`debounce`函数的用法如下: ```javascript _.debounce(func, wait, options) ``` - `func`:要执行的函数。 - `wait`:等待时间(毫秒),即事件触发后,等待多长时间执行函数。 - `options`:可选参数对象,可以设置更多的选项,比如`leading`和`trailing`。 `leading`和`trailing`是两个布尔值选项: - `leading`:默认为`false`,表示禁用首次执行。如果设置为`true`,则第一次触发事件时立即执行函数。 - `trailing`:默认为`true`,表示在最后一次触发事件后,再等待一段时间执行函数。如果设置为`false`,则最后一次触发事件后不再执行函数。 下面是一个简单的示例,演示如何使用`lodash`的`debounce`函数: ```javascript function saveToServer() { // 模拟发送数据到服务器的操作 console.log("Saving data to server..."); } var debouncedSave = _.debounce(saveToServer, 1000); // 模拟触发事件 debouncedSave(); debouncedSave(); debouncedSave(); // 1秒后,只会执行一次保存操作 ``` 在上述代码中,`saveToServer`函数会被防抖处理,只有在最后一次触发事件后等待1秒后,才会执行一次保存操作。 希望这个例子能够帮助您理解`lodash`中的`debounce`函数。如果您有任何其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值