实现Debounce

debounce函数所做的事情是:强制一个函数在某个连续的时间段内只执行一次,哪怕他本来会被调用多次,我们希望在用户停止某个操作一段时间之后才执行相应的监听函数,而不是在用户操作的过程当中,浏览器触发多少事件,就执行多少监听函数。

//弹跳函数
function debounce(fn,delay){
    var timer
    return function(){
        var _this = this;
        var args = arguments;

        //每次这个返回函数被调用,就清楚定时器,保证fn不被执行
        clearTimeout(time);
        //当返回的函数被最后一次调用(用户停止了某个连续动作),延迟delay毫秒后执行fn
        timer = setTimeout(function(){
            fn.apply(_this,args);
        },delay)
    }
}
//调用
$(document).on('mouvemove', debounce(function(e) {
    // 代码
}, 250))

原理:debounce返回一个闭包,这个闭包会被连续平凡的调用,但在闭包内部却显示了原始函数fn的执行,强制fn只在连续操作停止后执行一次。

使用场景:

1 比如,在某个 3s 的时间段内连续地移动了鼠标,浏览器可能会触发几十(甚至几百)个 mousemove 事件,不使用 debounce 的话,监听函数就要执行这么多次;如果对监听函数使用 100ms 的“去弹跳”,那么浏览器只会执行一次这个监听函数,而且是在第 3.1s 的时候执行的。
2 根据用户的输入实时向服务器发 ajax 请求获取数据。我们知道,浏览器触发 key* 事件也是非常快的,即便是正常人的正常打字速度,key* 事件被触发的频率也是很高的。以这种频率发送请求,一是我们并没有拿到用户的完整输入发送给服务器,二是这种频繁的无用请求实在没有必要。
更合理的处理方式是,在用户“停止”输入一小段时间以后,再发送请求。那么 debounce 就派上用场了:

$('input').on('keyup', debounce(function(e) {
    // 发送 ajax 请求
}, 300))

原文地址:https://blog.csdn.net/redtopic/article/details/69396722

你可能感兴趣的:(实现Debounce)