当前位置:首页 > JavaScript

js 实现防抖

2026-03-01 14:43:59JavaScript

防抖的实现原理

防抖(Debounce)是一种优化高频触发事件的技术,确保事件在停止触发一段时间后才会执行回调函数。适用于输入框搜索、窗口大小调整等场景。

js 实现防抖

基础防抖函数实现

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}
  • func: 需要防抖的实际执行函数
  • delay: 防抖延迟时间(毫秒)
  • 每次调用都会清除之前的定时器,重新计时

立即执行版本

有些场景需要首次触发立即执行,后续触发才防抖:

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

TypeScript 实现

增加类型安全的版本:

function debounce<T extends (...args: any[]) => void>(
  func: T,
  delay: number
): (...args: Parameters<T>) => void {
  let timeoutId: ReturnType<typeof setTimeout>;
  return (...args: Parameters<T>) => {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func(...args);
    }, delay);
  };
}

使用示例

const handleSearch = debounce((query) => {
  console.log('Searching for:', query);
  // 实际搜索逻辑
}, 500);

document.getElementById('search-input').addEventListener('input', (e) => {
  handleSearch(e.target.value);
});

注意事项

  • 防抖函数返回的新函数需要保持原始函数的 this 上下文,因此使用 apply
  • 对于需要取消的防抖操作,可以扩展返回取消方法
  • 延迟时间需要根据实际场景调整,通常搜索建议用 300-500ms,UI 调整用 100ms

js 实现防抖

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

相关文章

js实现乘

js实现乘

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

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 j…

js防抖和节流实现

js防抖和节流实现

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

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const rando…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…