防抖和节流

前因:窗口发生resize(窗口大小变化)、scroll、输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验很糟糕。
因果:为了减少事件处理函数的调用频率需要用到防抖和节流的方式。

函数防抖debounce
定义:多次触发事件后,事件处理函数只执行一次,即触发完事件n秒内(延迟时间)不再触发才执行该事件。
原理:对处理函数进行延时操作,若设定的延时到来之前,再次触发事件,则清除上一次的延时操作定时器,重新定时。一直到某次触发事件后在设定的延时内没有再次触发时,才会执行函数。
那么就有疑问了:若是频繁触发,岂不是要多次清除,多次重新定时?是的,所以每次都会生成定时器,只是若是上一次生成的定时器A还没有到时间,在此期间又触发了事件,后续产生的定时器B会把前面的定时器A清理掉。
代码:

// 计时器
var timer = false;
window.onscroll = function(){
    clearTimeout(timer);
    timer = setTimeout(function(){
        console.log("防抖");
        console.log(new Date());
    },300);
};

函数节流throttle
定义:触发函数事件后,短时间间隔内无法连续调用,只有上一次函数执行后,过了规定的时间间隔,才能进行下一次的函数调用。
原理:持续触发事件,每隔一段时间只执行一次。
实现方式:1.使用时间戳;2.设置定时器
代码:

//设置一个标志位,表示是否可以进行定时器
var flag = true;
window.onscroll = function(){
    if(!flag) return false;
    flag = false;
    setTimeout(function(){
        console.log("节流" + new Date());
        flag = true;
    },300);
};
  • 首先有一个标志位flag,默认是true,这个标志位控制是否能够进行定时器.
  • 如果 flag 是false,则直接返回,表示时间还没到,不能进行下一次定时器。
  • 如果 flag 是 true,说明能够进行一次处理
  • 在定时器中,处理方法操作外,最后一条语句flag = true表示,本段时间已经结束了,可以进行下一次的定时器

区别
节流:在频繁触发的情况下,节流会间隔延时时间去执行处理函数,比如连续点击4次,那么处理函数会间隔延时时间执行四次。
防抖:在频繁触发事件的情况下,只有在延时时间内没有触发操作才会执行,比如公交车乘客陆续刷卡上车,只有在没有乘客刷卡了,司机才会开车;如连续点击四次,那么处理函数最后只执行一次。

参考资料:
https://www.cnblogs.com/souleigh-hong/p/9171477.html
https://www.imooc.com/article/40106
Javascript防抖和节流的深入理解和实践:http://www.ptbird.cn/javascript-anti-shake-throttle.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值