防抖和节流

防抖和节流是JavaScript中用于优化性能的技术,主要应用于高频触发的事件处理,如按钮点击、滚动和窗口resize。防抖确保在设定时间内只执行最后一次操作,而节流则限制执行的频率,如每秒一次。文章提供了防抖和节流的函数封装示例,帮助开发者实现这些优化策略。
摘要由CSDN通过智能技术生成

防抖

规则

  • 防抖是当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则计时清零,重新计时;
  • 多次触发,只执行最后一次,如等电梯时,只要有一个人进来就需要再等n秒电梯才能关;

使用场景

  • 高频率触发的事件,如频繁点击按钮会发送过多的请求,使用防抖只让规定时间内最后一次触发的事件执行;
  • 浏览器行为,如scroll/resize, 频繁触发会造成计算过多;
  • 编辑行为的实时保存, 在无任何操作一定时间后,进行保存;

函数封装

function debounce(fn, delay) {
  let timer
  return function(...args) {
  if(timer) {
    clearTimeout(timer)
  }
  timer = setTimeout(() =>{
    //使用apply改变this的指向,第一个参数为待被指向的对象(timer),剩余的参数传入借过来的函数 (fn)中,作为借过来的函数的参数
    fn.apply(this,args)
  }, delay) 
  }
}

函数使用

function task() {
  //to do ...
}
debounce(task, 1000)

节流

规则

  • 节流可以控制事件发生的频率,如控制1秒发生一次;
  • 就像红绿灯,每等一段特定的时间就可以过一批;
  • 节流类型分为时间戳版和定时器版本,时间戳版本函数的触发是在时间段开始的时候,然后下一次函数的触发是在下一段时间段开始时;定时器版本函数的触发是在上一段时间段结束的时候,下一次函数的触发是在这一次时间段结束的时候;

使用场景

  • 高频率触发的事件(resize/scroll),在一段时间内只触发一次;
  • 鼠标触发的事件(如点击事件)单位时间内只触发一次;
  • 每个时间间隔计算一次进度,如滚动事件是否滚动到底部自动加载更多;

函数封装

//fn:使用节流的函数 ; delay:延迟执行的时间间隔; type: 节流类型(时间戳版/定时器版);
function throttle(fn, delay, type) {
  if(type === 1) let previous = 0
  if(type === 2) let timeout
  let delay = delay || 0
  return function () {
    let self = this
    let args = arguments
    if(type === 1) {
      let now = Date.now()
      if(now - previous > delay) {
        previous = now
        fn.apply(self, args)
      }
    }else if(type === 2){
      if(!timeout) {
        timeout = setTimeout(() => {
          timeout = null
          fn.apply(self, args)
        }, delay)
      }
    }
  }
}

函数使用

function task() {
  //to do ...
}
debounce(task, 1000, 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值