当前位置:首页 > JavaScript

js中防抖和节流实现

2026-04-05 02:27:51JavaScript

防抖(Debounce)

防抖的核心思想是在事件触发后,等待一定时间间隔(如 n 毫秒)再执行回调。如果在这段时间内事件再次被触发,则重新计时。

基础实现:

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

应用场景:

  • 搜索框输入联想(避免频繁请求)
  • 窗口大小调整事件(避免频繁计算布局)

立即执行版本:

js中防抖和节流实现

function debounceImmediate(func, delay, immediate = true) {
  let timeoutId;
  return function(...args) {
    const context = this;
    const callNow = immediate && !timeoutId;
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      timeoutId = null;
      if (!immediate) func.apply(context, args);
    }, delay);
    if (callNow) func.apply(context, args);
  };
}

节流(Throttle)

节流的核心思想是在固定时间间隔(如 n 毫秒)内只执行一次回调,无论事件触发多少次。

时间戳实现:

js中防抖和节流实现

function throttle(func, limit) {
  let lastTime;
  return function(...args) {
    const now = Date.now();
    if (!lastTime || now - lastTime >= limit) {
      func.apply(this, args);
      lastTime = now;
    }
  };
}

定时器实现:

function throttle(func, limit) {
  let timeoutId;
  return function(...args) {
    if (!timeoutId) {
      timeoutId = setTimeout(() => {
        func.apply(this, args);
        timeoutId = null;
      }, limit);
    }
  };
}

结合版本(首尾均执行):

function throttle(func, limit) {
  let timeoutId, lastTime = 0;
  return function(...args) {
    const now = Date.now();
    const remaining = limit - (now - lastTime);
    if (remaining <= 0) {
      if (timeoutId) {
        clearTimeout(timeoutId);
        timeoutId = null;
      }
      func.apply(this, args);
      lastTime = now;
    } else if (!timeoutId) {
      timeoutId = setTimeout(() => {
        func.apply(this, args);
        lastTime = Date.now();
        timeoutId = null;
      }, remaining);
    }
  };
}

应用场景:

  • 滚动事件监听(如无限滚动加载)
  • 鼠标移动事件(如拖拽元素)

注意事项

  1. this 绑定:使用 func.apply(this, args) 确保回调函数中的 this 指向正确。
  2. 参数传递:通过 ...args 保留事件参数。
  3. 取消机制:可扩展实现 cancel 方法清除定时器。
  4. 性能考量:高频事件(如 mousemove)建议使用 requestAnimationFrame 替代 setTimeout

标签: 防抖js
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…