当前位置:首页 > 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 实现思路 Vue 是一种流行的前端框架,用于构建用户界面。其核心思想是通过数据驱动和组件化开发,使开发过程更加高效和可维护。以下是 Vue 实现的一些关键思路: 数据驱动视图 Vue 采用…

Vue实现思路

Vue实现思路

Vue 实现思路 Vue 是一个渐进式 JavaScript 框架,适用于构建用户界面。其核心思想是数据驱动和组件化开发。以下是 Vue 实现的主要思路和方法: 数据驱动与响应式 Vue 通过数据绑…

vue路由实现思路

vue路由实现思路

Vue 路由实现思路 Vue 路由的核心是通过 Vue Router 库实现单页应用(SPA)的页面切换,避免整页刷新。以下是关键实现思路: 安装与引入 Vue Router 通过 npm 或 y…

vue实现登录思路

vue实现登录思路

Vue 登录功能实现思路 1. 前端页面设计 使用 Vue 的单文件组件(SFC)构建登录页面,包含表单元素(用户名、密码输入框)和提交按钮。表单需绑定 v-model 实现双向数据绑定,并通过 v-…

vue实现文件上传思路

vue实现文件上传思路

Vue 文件上传实现思路 使用原生 HTML5 文件上传 通过 <input type="file"> 元素结合 Vue 的数据绑定和事件处理实现基础文件上传功能。 <templ…

vue列表多选实现思路

vue列表多选实现思路

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