JavaScript实现防抖和节流

防抖

定义:单位时间内,频繁触发事件,只执行最后一次

封装防抖函数

思路

当触发一个事件时,防抖函数会启动一个定时器,延迟一段时间处理函数,如果在这段时间内又触发了同样的事件,就会清楚之前的定时器,并重新设置一个新的定时器。只有在最后一个事件触发后,经过一段时间内没有新的事件再次触发时,事件处理函数才会被执行

代码实现

function debounce(func, wait) {
    let timeout;
    return function (...args) {
        const context = this;
        clearTimeout(timeout);
        timeout = setTimeout(()=>{
            func.apply(context, args);
        },wait)
    };
}
​
// 使用:假设有一个输入框,当用户输入时需要触发一个搜索函数,但为了避免频繁触发,可以使用防抖函数来优化
const searchInput = document.getElementById("searchInput");
​
function search() {
  console.log("搜索内容:", searchInput.value);
}
​
const debouncedSearch = debounce(search, 300);
​
searchInput.addEventListener("input", debouncedSearch);

解释

  • debounce函数

    • 接收两个参数:func是需要防抖的函数,wait是延迟时间(单位毫秒)
    • 使用闭包保存了一个timeout变量,用于存储setTimeout的返回值
    • 返回一个新的函数,这个新函数会在每次调用时清除之前的定时器,并重新设置一个新的定时器
  • setTimeout

    • 通过setTimeout实现延迟调用,只有在延迟时间结束后才会执行目标函数
  • clearTimeout

    • 在每次调用新函数时,先清除之前的定时器,防止多个定时器同时存在
  • applay

    • 使用 apply 方法确保目标函数的上下文(this)和传入的参数正确

节流

定义:确保函数在一定时间间隔内最多执行一次,无论事件触发频率如何

封装节流函数

思路

当触发一个事件时,节流函数会立即执行该事件处理函数,然后在设定的时间间隔内,如果再次触发相同的事件,节流函数会忽略该事件,直到这段时间间隔过去,才会重新触发执行

代码实现

function throttle(func, limit) {
  let inThrottle;
  return function () {
    const args = arguments;
    const context = this;
    if (!inThrottle) {
      func.apply(context, args);
      inThrottle = true;
      setTimeout(() => {
        inThrottle = false;
      }, limit);
    }
  };
}
​
// 假设有一个页面滚动事件,需要在用户滚动页面时触发某个函数,但为了避免频繁触发,可以使用节流函数来优化
window.addEventListener("scroll", throttle(() => {
  console.log("页面滚动了");
}, 1000));

解释

  • throttle函数

    • 接收两个参数:func 是需要节流的函数,limit 是时间间隔(单位为毫秒)
    • 使用闭包保存一个变量 inThrottle,用于标记是否处于节流状态
  • inThrottle

    • 当函数被调用时,检查 inThrottle 是否为 true。如果是 true,则表示当前处于节流状态,直接返回,不执行函数
    • 如果是 false,则执行函数,并将 inThrottle 设置为 true,表示进入节流状态
  • setTimeout

    • 使用 setTimeout在指定的时间间隔 limit后将 inThrottle设置为 false,表示节流状态结束
  • apply

    • 使用 apply方法确保目标函数的上下文(this)和传入的参数正确
最后修改:2025 年 03 月 20 日
如果觉得我的文章对你有用,请随意赞赏