js debounce(防抖动函数)和 throttle(节流函数)

288 阅读2分钟

防抖与节流概述 使用lodash实现防抖与节流 在Vue中使用防抖和节流

函数防抖 _.debounce防止重复触发,延迟函数执行。即不管debounce函数触发了多久,只在最后一次触发debounce函数时,才定义setTimeout,到达间隔时间再执行 需要防抖的函数。 用处:多用于 input 框 输入时,显示匹配的输入内容的情况

函数节流_.throttle: 真正的含义是:单位时间n秒内,第一次触发函数并执行,以后 n秒内不管触发多少次,都不执行。直到下一个单位时间n秒,第一次触发函数并执行,这个n秒内不管函数多少次都不执行。 用处:多用于页面scroll滚动,或者窗口resize,或者防止按钮重复点击等情况

函数防抖是 n秒后延迟执行;而函数节流是立马执行,n秒后再立马执行。

防抖和节流的区别 1.共同点:降频, 2.不同点 :思路不同

  1. 防抖:某个时间内不能再次触发,一旦触发,就要重新计算

  2. 节流:限制相邻两次调用的时间间隔

注意点 :防抖和节流不止上面两种方案可以执行

短时间内不重复触发一个事件 设置一个门槛值,表示两次 Ajax 通信的最小间隔时间。如果在间隔时间内,发生新的keydown事件,则不触发 Ajax 通信,并且重新开始计时。如果过了指定时间,没有发生新的keydown事件,再将数据发送出去。

这种做法叫做 debounce(防抖动)。假定两次 Ajax 通信的间隔不得小于2500毫秒,上面的代码可以改写成下面这样。

$('textarea').on('keydown', debounce(ajaxAction, 2500));

function debounce(fn, delay){
  var timer = null; // 声明计时器
  return function() {
    var context = this;
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}

上面代码中,只要在2500毫秒之内,用户再次击键,就会取消上一次的定时器,然后再新建一个定时器。这样就保证了回调函数之间的调用间隔,至少是2500毫秒。

用法示例: 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

参考资料 js教程 Vue中防抖(debounce)、节流(throttle)的介绍与运用

Debouncing and Throttling Explained Through Examples lodash.debounce lodash.throttle

第三方库 :Lodash

添加依赖:

yarn add lodash.throttle
yarn add lodash.debounce

使用:

import _ from 'lodash'
export default {
  data() {
    return {
      a: 0
    }
  },
  methods: {
    func1: _.throttle(function(data) {
      ...
      this.a = 1
    }, 2000),
    func2: _.debounce(function(data) {
      ...
    }, 2000),
  }
}

tip 注意 在throttledebounce中需要使用非箭头的匿名函数形式,由于lodash已对this做了绑定处理,函数体中的this就是当前Vue组件实例。

参考:

- [Lodash官网]