当前位置:首页 > JavaScript

js节流防抖实现思路

2026-01-31 06:17:12JavaScript

节流(Throttle)的实现思路

节流的核心思想是在一定时间内,无论事件触发多少次,只执行一次回调函数。适用于高频事件(如滚动、鼠标移动)的场景。

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

使用时间戳实现,第一次立即执行,后续每隔delay毫秒执行一次。适用于需要立即响应的场景。

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

使用定时器实现,第一次延迟执行,停止触发后会再执行一次。适用于需要保证最终执行的场景。

js节流防抖实现思路

防抖(Debounce)的实现思路

防抖的核心思想是事件触发后等待一段时间再执行回调,若在等待期间再次触发则重新计时。适用于输入框搜索联想等场景。

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

基础版实现,延迟执行,连续触发时重置延迟时间。

js节流防抖实现思路

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

增强版支持立即执行选项,第一次触发立即执行,后续触发需等待延迟结束。

两者区别与选择

节流保证周期内至少执行一次,适合连续高频触发但需要均匀响应的场景(如页面滚动)。

防抖在连续触发时不执行,直到停止后才执行,适合需要最终结果的场景(如搜索输入完成后的查询)。

实际应用示例

// 节流应用:滚动加载更多
window.addEventListener('scroll', throttle(loadMore, 500));

// 防抖应用:搜索框联想
input.addEventListener('input', debounce(fetchSuggestions, 300));

注意事项

高频场景中,使用requestAnimationFrame替代setTimeout可获得更流畅的性能表现。在React/Vue等框架中可直接使用useThrottle/useDebounce等Hook实现。

标签: 防抖思路
分享给朋友:

相关文章

vue实现防抖

vue实现防抖

Vue 实现防抖的方法 防抖(Debounce)是一种限制函数频繁调用的技术,确保函数在连续触发时只执行一次。以下是几种在 Vue 中实现防抖的方法。 使用 Lodash 的 _.debounce…

vue列表多选实现思路

vue列表多选实现思路

Vue列表多选实现思路 基础实现:v-model绑定数组 通过v-model绑定一个数组,配合checkbox的value属性实现多选。选中时自动将值添加到数组,取消选中时从数组中移除。 &…

vue防抖怎么实现

vue防抖怎么实现

防抖的实现原理 防抖(Debounce)是一种限制函数频繁调用的技术,确保函数在最后一次调用后的指定时间间隔内只执行一次。适用于输入框搜索、窗口调整等场景。 Vue 中实现防抖的两种方式 方法一:使…

vue路由权限实现思路

vue路由权限实现思路

路由权限实现思路 在Vue项目中实现路由权限控制通常涉及前端和后端的协作,以下是常见的几种实现思路: 前端动态路由 通过用户登录后获取的权限数据动态生成可访问的路由表,使用router.addRou…

vue下拉加载实现思路

vue下拉加载实现思路

vue下拉加载实现思路 监听滚动事件 通过监听滚动事件判断是否滚动到底部,触发加载更多数据。在mounted钩子中绑定事件,beforeDestroy钩子中解绑事件,避免内存泄漏。 mounted(…

react banner实现思路

react banner实现思路

实现React Banner的基本思路 使用React实现Banner组件需要考虑动态展示、交互效果以及响应式设计。以下是常见的实现方法: 使用状态管理控制当前展示项 通过React的useStat…