节流与防抖

在JavaScript中,节流和防抖是优化频繁触发事件的常用技术。节流确保在设定的时间间隔内只执行第一次触发的事件,而防抖则确保在最后触发的事件发生后才执行。这两种技术通过设置定时器和缓存触发时间来控制事件的执行频率,以提高性能和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在页面中,懒加载、以及可能频繁触发的事件,通常都会有时间的延迟,这时候频繁的触发会导致事件多次触发而达不到本应出现的效果。这时就需要对事件进行相应的节流或者防抖。
节流与防抖主要是通过在事件函数中,嵌套回调函数,以自由变量的形式缓存时间信息,最后用 setTimeout 来控制事件的触发频率。

节流:取对应时间内第一次触发的

  • 节流的思路就是:在规定的某一时间内,不管触发多少次请求,只会取第一次,并且在该时间内,不会进行新的触发响应。

大致代码为:

// cb我们需要包装的事件回调, time是时间间隔
function throttle(cb, time) {
  // last为上一次触发回调的时间
  let last = 0;
  
  // 将throttle处理结果当作函数返回
  return function () {
    // 保留调用时的this上下文
     let _this = this;
     // 保留调用时传入的参数
     let args = arguments;
     // 记录本次触发回调的时间
     let now = new Date().getTime();
     
     // 判断上次触发的时间和本次触发的时间差是否小于给定的时间间隔
     if (now - last >= time) {
     // 如果时间间隔大于我们设定的时间间隔阈值,则执行回调
         last = now;
         fn.apply(_this, args);
     }
  }
}

防抖:取对应时间内最后一次触发的

  • 防抖的思路就是:在规定的某一时间内,不管触发多少次请求,只会取最后一次做出响应,前面的请求会被后一次请求覆盖。

大致代码为:

// cb是我们需要包装的事件回调, time是时间间隔的阈值
function throttle(cb, time) {
  // last为上一次触发回调的时间, timer是定时器
  let last = 0;
  let timer = null;
  // 将throttle处理结果当作函数返回
  
  return function () { 
    // 保留调用时的this上下文
    let _this = this;
    // 保留调用时传入的参数
    let args = arguments;
    // 记录本次触发回调的时间
    let now = new Date().getTime();
    
    // 判断上次触发的时间和本次触发的时间差是否小于时间间隔
    if (now - last < time) {
    // 如果时间间隔小于我们设定的时间间隔,则为本次触发操作设立一个新的定时器
       clearTimeout(timer)
       timer = setTimeout(function () {
          last = now;
          cb.apply(_this, args);
        }, time)
    } else {
        // 如果时间间隔超出了我们设定的时间间隔,那就直接反馈响应,并把last更新
        last = now;
        cb.apply(_this, args);
    }
  }
}

小结

节流与防抖都是对频繁触发的事件回调进行优化控制,但是一个是取首次,一个是取最后一次,需要根据具体的需求来使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值