当前位置:首页 > JavaScript

JS节流和防抖的实现

2026-01-31 10:10:20JavaScript

节流(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;
    }
  };
}

使用时间戳实现,确保在延迟时间内不会重复执行。最后一次调用如果在时间间隔内会被忽略。

定时器版本实现:

JS节流和防抖的实现

function throttle(func, delay) {
  let timer = null;
  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        func.apply(this, args);
        timer = null;
      }, delay);
    }
  };
}

防抖(Debounce)的实现

防抖是指触发高频事件后,函数在指定延迟后执行,若在延迟期间再次触发则重新计时。常用于输入框实时搜索。

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

基础版本会在延迟结束时执行最后一次调用。如果需要立即执行第一次调用,后续延迟可采用以下实现:

JS节流和防抖的实现

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

差异与应用场景

节流保证在固定间隔执行,适用于连续触发但需要均匀执行的情况,如滚动加载。

防抖在连续触发后只执行一次,适用于高频触发但只需最终结果的场景,如搜索框输入联想。

两者均可通过闭包保存状态,核心区别在于时间控制逻辑:节流是“固定周期”,防抖是“重置延迟”。

标签: 防抖JS
分享给朋友:

相关文章

JS如何调用react组件

JS如何调用react组件

调用React组件的常见方法 在JavaScript中调用React组件通常涉及以下几种场景和方式: 直接渲染组件 通过ReactDOM.render()方法将组件渲染到DOM节点: import…

react实现防抖

react实现防抖

防抖的概念 防抖(Debounce)是一种优化高频触发事件的技术,确保事件在停止触发后的一段时间内只执行一次。适用于输入框搜索、窗口调整等场景。 实现方法一:使用 lodash 库 安装 loda…

JS如何实现左右滑动

JS如何实现左右滑动

实现左右滑动的方法 使用 touchstart、touchmove 和 touchend 事件监听触摸操作,计算滑动距离和方向。 let startX, moveX; element.addEv…

js 实现防抖

js 实现防抖

防抖的概念 防抖(Debounce)是一种优化高频触发事件的技术,确保事件在停止触发后的指定时间内只执行一次。常用于输入框搜索、窗口大小调整等场景。 基础实现 使用定时器延迟执行函数,若在延…

JS实现日期滚动选择

JS实现日期滚动选择

实现日期滚动选择的基本思路 使用HTML、CSS和JavaScript创建一个日期滚动选择器,允许用户通过滚动选择年、月、日。核心是通过监听滚动事件,动态更新显示的值。 HTML结构 创建一个包含…

JS实现文本的删除

JS实现文本的删除

使用 substring() 方法 通过指定起始和结束索引截取字符串的一部分,间接实现删除效果。 let str = "Hello World"; let newStr = str.substr…