当前位置:首页 > JavaScript

js防抖和节流实现

2026-02-28 18:20:08JavaScript

防抖(Debounce)的实现

防抖的核心思想是在事件触发后等待一段时间再执行回调,若在等待期间再次触发事件,则重新计时。适用于输入框搜索联想、窗口大小调整等场景。

基础实现:

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

立即执行版本:

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

节流(Throttle)的实现

节流的核心思想是在固定时间间隔内只执行一次回调。适用于滚动事件、高频点击等场景。

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;
    }
  };
}

定时器版本:

js防抖和节流实现

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 lastTime = 0;
  let timeoutId;
  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);
        timeoutId = null;
        lastTime = Date.now();
      }, remaining);
    }
  };
}

使用示例

防抖示例:

const searchInput = document.getElementById('search');
const debouncedSearch = debounce(function() {
  console.log('Searching:', this.value);
}, 500);
searchInput.addEventListener('input', debouncedSearch);

节流示例:

window.addEventListener('scroll', throttle(function() {
  console.log('Scrolling:', window.scrollY);
}, 200));

关键区别

防抖在连续触发时只执行最后一次,节流在固定时间间隔内必定执行一次。根据实际场景需求选择合适的方法。高频事件中需要即时反馈用节流,只需最终结果用防抖。

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

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现百叶窗

js实现百叶窗

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

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…