节流&防抖

函数防抖(debounce)

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

function debounce(fn, delay) {
  let timer = null;

  return function() {
    if (timer) clearTimeout(timer);

    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, delay);
  };
}

函数节流(throttle)

规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

drag(拖动)事件或者 scroll(滚动) 期间触发某个毁掉,要设置一个时间间隔。这时候就不能使用防抖了,为什么呢?
防抖是拖拽或者滚动结束之后才返回回调,但是我是需要在过程中进行触发回调,但是又不需要那么的频繁;这时候就使用节流函数,每隔一定的时间进项触发就好了!

function throttle(fn, delay) {
  let timer = null;

  return function() {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, arguments);

        timer = null; // 执行完成后,重置为 null,以便下次触发事件时,再次执行函数。
      }, delay);
    }
  };
}

总结

  • 函数防抖和函数节流都是防止某一时间频繁触发,但是它们之间的原理却不一样。
  • 函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。

结合应用场景

  • debounce防抖
    • 一个搜索输入框,用户不停的进行输入(这个时候就是抖动的过程),等用户输入停止之后,再触发搜索。
    • window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次。
  • throttle节流
    • 鼠标不断点击触发,mousedown(单位时间内只触发一次)。
    • 监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断。
posted @ 2023-02-17 11:45  strongerPian  阅读(19)  评论(0编辑  收藏  举报
返回顶端