返回

手写防抖与节流,你学会了吗?

前端

前言

欢迎来到「jsliang 求职系列」的第十二期!在这篇文章中,我们将深入探索「防抖」与「节流」这两个重要的前端技术,帮助你更好地理解它们的原理和应用。如果你正在为前端面试做准备,那么一定要认真阅读本文,因为「防抖」和「节流」是前端面试中经常被问到的知识点。

正文

防抖

防抖,顾名思义,就是为了防止某个函数在短时间内被频繁触发。这在实际开发中非常常见,比如监听拖拽滚动条,然后频繁向下滚动信息,会变得很慢,很迟钝。再比如,点击提交表单后,用户在结果还没出来的时候重复触发。简单来说:某件事你并不想它太过频繁触发,那么设置一个定时器,每次进来的时候都清除原本的定时器,重新计算。如果在定时器到期之前又触发了这件事,那就再次清除定时器,重新计算。这样就能保证这件事不会在短时间内被频繁触发。

在代码实现上,防抖可以有两种方式:

  1. setTimeout
function debounce(func, wait) {
  let timer = null;
  return function() {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      func.apply(this, arguments);
    }, wait);
  };
}
  1. requestAnimationFrame
function debounce(func, wait) {
  let requestId = null;
  return function() {
    if (requestId) {
      cancelAnimationFrame(requestId);
    }
    requestId = requestAnimationFrame(() => {
      func.apply(this, arguments);
    });
  };
}

节流

节流,顾名思义,就是为了限制某个函数在单位时间内只能被触发一次。这在实际开发中也非常常见,比如限制用户在单位时间内只能发送一次请求,或者限制用户在单位时间内只能点击一次按钮。简单来说:某件事你并不想它在单位时间内被频繁触发,那么设置一个定时器,在定时器到期之前,这件事只能触发一次。

在代码实现上,节流可以有两种方式:

  1. setTimeout
function throttle(func, wait) {
  let timer = null;
  return function() {
    if (!timer) {
      timer = setTimeout(() => {
        func.apply(this, arguments);
        timer = null;
      }, wait);
    }
  };
}
  1. requestAnimationFrame
function throttle(func, wait) {
  let requestId = null;
  return function() {
    if (!requestId) {
      requestId = requestAnimationFrame(() => {
        func.apply(this, arguments);
        requestId = null;
      });
    }
  };
}

总结

好了,以上就是「防抖」和「节流」的全部内容了。希望你能够通过本文对这两个重要技术有更深入的了解。如果你正在为前端面试做准备,那么一定要掌握好「防抖」和「节流」的知识点,因为它们是前端面试中经常被问到的。

最后,祝愿大家都能在求职路上披荆斩棘,勇往直前!

拓展阅读