返回

从手写防抖与节流策略认识编程的艺术

前端

前言

在前端开发中,我们经常会遇到一些需要对用户输入做出反应的场景。比如,用户在输入框中输入内容时,我们可能需要实时更新搜索结果;用户在滚动页面时,我们可能需要加载更多的内容。为了避免对服务器造成过多的请求,我们需要对这些场景进行优化。

防抖与节流

防抖与节流都是用来优化用户输入响应的策略。它们都可以减少对服务器的请求次数,但它们的工作方式却截然不同。

防抖

防抖策略的核心思想是:如果在一个时间间隔内,某个事件被触发多次,那么只执行一次该事件的回调函数。

防抖策略的实现非常简单,我们可以使用 JavaScript 的 setTimeout() 函数来实现。如下面的代码所示:

function debounce(func, wait) {
  let timeout;
  return function () {
    const args = arguments;
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(this, args);
    }, wait);
  };
}

这个函数接收两个参数:要执行的函数 func 和等待时间 wait。当这个函数被调用时,它会立即清除任何现有的超时计时器,然后创建一个新的超时计时器。如果在这个等待时间内,这个函数再次被调用,那么新的计时器会覆盖旧的计时器,从而防止回调函数被执行。只有当等待时间过去后,回调函数才会被执行。

节流

节流策略的核心思想是:在一个时间间隔内,某个事件最多只执行一次回调函数。

节流策略的实现也比较简单,我们可以使用 JavaScript 的 setInterval() 函数来实现。如下面的代码所示:

function throttle(func, wait) {
  let lastCall = 0;
  return function () {
    const args = arguments;
    const now = Date.now();
    if (now - lastCall >= wait) {
      func.apply(this, args);
      lastCall = now;
    }
  };
}

这个函数接收两个参数:要执行的函数 func 和等待时间 wait。当这个函数被调用时,它会先检查上次回调函数被执行的时间戳 lastCall。如果当前时间 nowlastCall 之间的差值大于或等于等待时间 wait,那么回调函数 func 就会被执行,并且 lastCall 会被更新为当前时间。否则,回调函数 func 不会被执行。

应用场景

防抖与节流策略都有各自的应用场景。

防抖策略的应用场景

防抖策略适用于以下场景:

  • 用户在输入框中输入内容时,实时更新搜索结果。
  • 用户在滚动页面时,加载更多的内容。
  • 用户在拖动元素时,实时更新元素的位置。

节流策略的应用场景

节流策略适用于以下场景:

  • 用户连续点击按钮时,只执行一次回调函数。
  • 用户连续滚动页面时,只加载一次内容。
  • 用户连续拖动元素时,只更新一次元素的位置。

编程的艺术

防抖与节流策略的实现看似简单,但它们却体现了编程的艺术。

清晰易懂的代码

防抖与节流策略的代码都非常简洁明了,很容易理解。这得益于 JavaScript 的 setTimeout()setInterval() 函数提供了非常方便的定时功能。

设计模式与优化技巧

防抖与节流策略都是设计模式的典型应用。它们都采用了“函数柯里化”的技术,将函数的执行延迟到了另一个时间点。此外,防抖与节流策略还使用了“闭包”的技术,来保存函数的执行上下文。

结语

防抖与节流策略是前端开发中非常实用的技巧,它们可以帮助我们优化用户输入响应,减少对服务器的请求次数。希望本文能帮助您更好地理解防抖与节流策略,并在您的项目中合理地使用它们。