函数防抖(debounce)

在事件被触发后n秒内再执行回调,如果在这段时间内再次触发,则重新开始计时

防抖使用的场景:

  • 在搜索时,输入文字后一段时间内开始自动搜索,而不是每次按键都执行搜索操作
  • window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次

虽然知道概念,但是面试时让我写一个通用的防抖函数,有一点懵,下面贴代码:

const debounce = (fn, ms = 0) => {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => fn.apply(this, args), ms);
  };
};

函数节流(throttle)

在一个规定时间内,最多只能触发一次,即第一次触发后,至少间隔一个规定时间,才会触发第二次。

使用场景:

  • 鼠标不断点击触发,mousedown(单位时间内只触发一次)
  • 监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断
const throttle = (fn, ms) => {
  let flag = true;
  return function(...args) {
    if(flag) {
      fn.apply(this, args);
      flag = false;
      setTimeout(() => {
        flag = true;
      }, ms);
    }
  }
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

严格模式 上一篇
ECharts图表resize 下一篇