当前位置:首页 > 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内置的v-model指令绑定数组类型数据,当选中多个选项时,会自动将值添加到数组中 <template> <div> <label…

vue虚拟列表实现思路

vue虚拟列表实现思路

虚拟列表的核心概念 虚拟列表是一种优化长列表渲染性能的技术,通过仅渲染可视区域内的元素减少DOM节点数量。其核心思想是动态计算可见区域的数据索引,避免全量渲染。 计算可视区域范围 监听滚动事件,根据…

vue路由权限实现思路

vue路由权限实现思路

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

react实现防抖

react实现防抖

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

js中防抖和节流实现

js中防抖和节流实现

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟期间再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce(func…

js 实现思路

js 实现思路

JavaScript 实现思路 在 JavaScript 中实现某个功能通常需要明确需求、设计算法、编写代码和测试优化。以下是一个通用的实现思路框架: 明确需求 确定需要实现的功能目标,例如数据处理…