万普插件库

jQuery插件大全与特效教程

JS 防抖、节流

防抖(Debounce)和节流(Throttle)是 JavaScript 中两种常见的性能优化技术,用于控制函数在一定时间内的执行频率。它们的核心目的是减少高频触发事件(如滚动、输入、窗口调整等)带来的性能问题,但它们的实现方式和适用场景有所不同。


1.防抖(Debounce)

防抖的核心思想是:在事件被触发后,等待一段时间再执行函数。如果在这段时间内事件再次被触发,则重新计时。

适用场景

  • 输入框实时搜索(等待用户停止输入后再发送请求)。
  • 窗口大小调整(等待用户停止调整后再计算布局)。
  • 按钮点击防止重复提交。

实现原理

  • 设置一个定时器,延迟执行函数。
  • 如果在延迟时间内事件再次触发,则清除之前的定时器并重新计时。

代码实现

function debounce(func, delay) {
  let timer;
  return function (...args) {
    clearTimeout(timer); // 清除之前的定时器
    timer = setTimeout(() => {
      func.apply(this, args); // 延迟执行
    }, delay);
  };
}

// 示例:输入框防抖
const input = document.querySelector('input');
input.addEventListener('input', debounce(() => {
  console.log('Input value:', input.value);
}, 300));

2.节流(Throttle)

节流的核心思想是:在一定时间间隔内,函数最多执行一次。无论事件触发多少次,函数都会按照固定的时间间隔执行。

适用场景

  • 滚动事件(每隔一段时间检查滚动位置)。
  • 鼠标移动事件(每隔一段时间更新鼠标位置)。
  • 游戏中的按键操作(限制操作频率)。

实现原理

  • 设置一个标志位(或时间戳),记录上一次函数执行的时间。
  • 如果当前时间与上一次执行时间的间隔大于设定的时间,则执行函数并更新标志位。

代码实现

function throttle(func, delay) {
  let lastTime = 0;
  return function (...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      func.apply(this, args); // 执行函数
      lastTime = now; // 更新上一次执行时间
    }
  };
}

// 示例:滚动事件节流
window.addEventListener('scroll', throttle(() => {
  console.log('Scrolling...');
}, 300));

3.防抖和节流的区别

特性

防抖(Debounce)

节流(Throttle)

执行时机

事件停止触发后执行

按照固定时间间隔执行

触发频率

高频触发时只执行一次

高频触发时按固定频率执行

适用场景

输入框搜索、窗口调整

滚动事件、鼠标移动

代码实现

使用 setTimeout 和 clearTimeout

使用时间戳或标志位

是否立即执行

可以配置是否立即执行(前缘防抖)

通常不立即执行


4.结合防抖和节流

在某些场景下,可能需要结合防抖和节流的特性。例如,在滚动事件中,可以先使用节流确保函数按固定频率执行,再使用防抖确保在滚动停止后执行一次。

示例代码

function debounce(func, delay) {
  let timer;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

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

// 结合防抖和节流
const combined = throttle(debounce(() => {
  console.log('Combined debounce and throttle');
}, 300), 100);

window.addEventListener('scroll', combined);

5.总结

  • 防抖:适合处理事件停止后的操作,例如输入框搜索。
  • 节流:适合处理高频触发但需要按固定频率执行的操作,例如滚动事件。
  • 根据具体场景选择合适的优化技术,可以有效提升性能和用户体验。
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言