当前位置:首页 > JavaScript

js节流防抖实现思路

2026-03-01 21:28:58JavaScript

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

定时器版
通过设置定时器延迟执行,确保间隔内仅触发一次。

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

防抖(Debounce)实现思路

防抖的核心是延迟执行函数,直到事件停止触发后一段时间才执行。

js节流防抖实现思路

基础版
每次触发时重置定时器,确保连续触发时仅最后一次生效。

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) {
  let timer = null;
  return function(...args) {
    if (timer) clearTimeout(timer);
    if (immediate && !timer) {
      fn.apply(this, args);
    }
    timer = setTimeout(() => {
      timer = null;
      if (!immediate) fn.apply(this, args);
    }, delay);
  };
}

应用场景对比

节流适用场景

  • 页面滚动事件(scroll)
  • 窗口大小调整(resize)
  • 鼠标移动(mousemove)

防抖适用场景

  • 输入框实时搜索(input)
  • 表单提交按钮防重复点击
  • 自动保存功能

结合实现(增强版)

可同时支持节流和防抖的复合函数:

function enhancedThrottle(fn, delay, { leading = true, trailing = true } = {}) {
  let lastTime = 0, timer = null;
  return function(...args) {
    const now = Date.now();
    if (leading && now - lastTime >= delay) {
      fn.apply(this, args);
      lastTime = now;
    } else if (trailing) {
      clearTimeout(timer);
      timer = setTimeout(() => {
        fn.apply(this, args);
        lastTime = now;
      }, delay);
    }
  };
}

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

相关文章

vue商品列表实现思路

vue商品列表实现思路

实现 Vue 商品列表的核心思路 数据驱动渲染 通过 Vue 的响应式特性,将商品数据存储在 data 或 Vuex/Pinia 状态管理中,使用 v-for 指令动态渲染列表。数据格式通常为数组,每…

vue实现拖动图片思路

vue实现拖动图片思路

Vue 实现拖动图片的思路 在 Vue 中实现图片拖动功能,可以通过以下方法实现: 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件…

vue轮播抽奖实现思路

vue轮播抽奖实现思路

Vue轮播抽奖实现思路 轮播抽奖是一种常见的互动效果,通过快速切换选项最终停在某个奖品上。以下是基于Vue的实现思路和关键步骤: 核心逻辑设计 使用Vue的data管理当前高亮项的索引和抽奖状态…

react banner实现思路

react banner实现思路

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

js节流防抖实现思路

js节流防抖实现思路

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

vue ssr实现思路

vue ssr实现思路

Vue SSR 实现思路 Vue SSR(Server-Side Rendering)的核心目标是在服务端生成完整的 HTML 并直接返回给客户端,从而提升首屏加载速度和 SEO 友好性。以下是关键实…