美文网首页
函数防抖与函数节流

函数防抖与函数节流

作者: 滚石_c2a6 | 来源:发表于2018-04-28 09:53 被阅读9次

    概念

    函数防抖(debounce)

    当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间

    函数节流(throttle)

    预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期

    函数节流(throttle)

    函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。

    比如如下的情况:

    • window对象的resize、scroll事件
    • 拖拽时的mousemove事件
    • 文字输入、自动完成的keyup事件

    可以拿我们平时坐电梯为例来形象地表述二者的区别

    函数防抖:如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)。

    函数节流

    :保证如果电梯第一个人进来后,10秒后准时运送一次,这个时间从第一个人上电梯开始计时,不等待,如果没有人,则不运行
    参考:https://www.jianshu.com/p/d038f05ea801
    实现:

    var throttle = function(fn, delay){
        var timer = null;
        return function(){
            var context = this, args = arguments;
            clearTimeout(timer);
            timer = setTimeout(function(){
                fn.apply(context, args);
            }, delay);
        };
     };
    window.onresize = throttle(myFunc, 100);
    

    但是,仔细想想,上面的实现方式还是有一定的缺点。如果页面很长,我们一直在缩放页面,那myFunc方法就一直不会被执行。所以我们可以升级一下上述的防抖方法。

    var throttleV2 = function(fn, delay, mustRunDelay){
        var timer = null;
        var t_start;
        return function(){
            var context = this, args = arguments, t_curr = +new Date();
            clearTimeout(timer);
            if(!t_start){
                t_start = t_curr;
            }
            if(t_curr - t_start >= mustRunDelay){
                fn.apply(context, args);
                t_start = t_curr;
            }
            else {
                timer = setTimeout(function(){
                    fn.apply(context, args);
                }, delay);
            }
        };
     };
    window.onresize = throttleV2(myFunc, 50, 100);
    

    参考:http://www.alloyteam.com/2012/11/javascript-throttle/

    相关文章

      网友评论

          本文标题:函数防抖与函数节流

          本文链接:https://www.haomeiwen.com/subject/btgwlftx.html