防抖和节流

181 阅读2分钟

1: 防抖 (多次触发 只执行最后一次) 防抖策略(debounce)是当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则重新计时。

作用: 高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间内再次触发,则重新计算时间。

2: 防抖的应用场景:

2.1 :登录、发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖; 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖; 文本编辑器实时保存,当无任何更改操作一秒后进行保存。

2.2:搜索框搜索信息 1.不是每输入一个字就立马搜索词条,而是会登一段时间,如果这段时间用户,有输入了,证明用户只想搜这个,直接搜。 2.如果这段时间用户又输入了,那证明用户还没有输完,在等一段时间,看用户最终实际想搜索什么。

3:函数防抖的实现:

  var timer = null;

  return function() {
    var context = this,
      args = [...arguments];

    // 如果此时存在定时器的话,则取消之前的定时器重新记时
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }

    // 设置定时器,使事件间隔指定事件后执行
    timer = setTimeout(() => {
      fn.apply(context, args);
    }, wait);
  };
}

4: 节流 (规定时间内 只触发一次)

4.1:节流策略(throttle),控制事件发生的频率,如控制为1s发生一次,甚至1分钟发生一次。与服务端(server)及网关(gateway)控制的限流 (Rate Limit) 类似。 作用: 高频率触发的事件,在指定的单位时间内,只响应第一次。

4.:2: 节流的应用场景 鼠标连续不断地触发某事件(如点击),单位时间内只触发一次; 监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断。例如:懒加载; 浏览器播放事件等。

4.3:函数节流的实现:

function throttle(fn, delay) {
  var preTime = Date.now();

  return function() {
    var context = this,
      args = [...arguments],
      nowTime = Date.now();

    // 如果两次时间间隔超过了指定时间,则执行函数。
    if (nowTime - preTime >= delay) {
      preTime = Date.now();
      return fn.apply(context, args);
    }
  };
}

// 定时器版
function throttle (fun, wait){
  let timeout = null
  return function(){
    let context = this
    let args = [...arguments]
    if(!timeout){
      timeout = setTimeout(() => {
        fun.apply(context, args)
        timeout = null 
      }, wait)
    }
  }
}