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

vue路由实现思路

vue路由实现思路

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

vue商品列表实现思路

vue商品列表实现思路

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

vue的防抖实现

vue的防抖实现

Vue 防抖实现方法 在Vue中实现防抖(debounce)可以通过以下几种方式完成: 使用Lodash库的debounce方法 安装Lodash: npm install lodash…

vue项目实现防抖

vue项目实现防抖

Vue 项目中实现防抖的方法 防抖(Debounce)是一种限制函数频繁调用的技术,确保函数在最后一次调用后的一段时间内不再被触发。以下是几种在 Vue 项目中实现防抖的方法: 使用 Lodash…

vue下拉加载实现思路

vue下拉加载实现思路

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