美文网首页
防抖、节流(亲测有效)

防抖、节流(亲测有效)

作者: 陈大事_code | 来源:发表于2019-11-11 16:31 被阅读0次
  • 防抖(一段时间内,只执行最后一次。通俗点,不管你点多少次,执行最后一次
  • 节流(每段时间内,只执行一次。通俗点,你一直点一直点,会每隔一个固定时间执行一次

防抖

解释:“一段时间内,只执行最后一次”:比如,2s内点击按钮6次,那么防抖只会执行第六次点击事件,前面五次不会执行。

原理:通过定时器实现,每点击一次按钮,将该点击事件放入定时器,2s之后执行,此时若再次点击按钮,<u>就清除第一次设置的定时器</u>,重新设置一个新的2s定时器,以此类推,直到最后一次点击,2s之后启动该定时器事件,达到防抖效果。

代码实现:

function Debounce(fn, t) {
    let delay = t || 2000; // 默认2s
    let timer;
    return function () {
        let args = arguments;
        if(timer){
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            timer = null;
            fn.apply(this, args);
        }, delay);
    }
}

节流

解释:"每段时间内,只执行一次":比如,一直点击一个按钮,会每隔一个interval执行一次点击事件。

原理:通过定时器事件,第一次点击,则立即执行该点击事件,在interval内,再次点击,则会将该事件放入定时器,在interval内如果再再点击,则清除上一个定时器,重新设置一个定时器。超过了interval,那么就直接执行该事件。

代码如下:

 const Throttle = (fn, t) => {
    let last;
    let timer;
    let interval = t || 2000;
    return function () {
        let args = arguments;
        let now = +new Date();
        if (last && now - last < interval) {
            clearTimeout(timer);
            timer = setTimeout(() => {
                last = now;
                fn.apply(this, args);
            }, interval);
        } else {
            last = now;
            fn.apply(this, args);
        }
    }
}

个人见解:该方法存在弊端,并不是严格的每隔一段时间内执行一次该方法。

比如:设置interval为3000,第一次点击直接执行(坐标设为0),2s后第二次点击(坐标设为2),此时设置了一个定时器,3s之后执行(即在坐标5执行),4s后第三次点击(坐标为4),此时为立即执行,但是注意到有一个定时器会在坐标5处执行,且并未清除,那么在坐标4,坐标5都会执行该事件,这就造成了不是严格按照interval执行事件了。

相关文章

网友评论

      本文标题:防抖、节流(亲测有效)

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