当前位置:首页 > JavaScript

js 实现防抖

2026-03-01 14:43:59JavaScript

防抖的实现原理

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

基础防抖函数实现

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 实现

增加类型安全的版本:

js 实现防抖

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实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…

js实现复选框

js实现复选框

实现复选框的基本方法 使用HTML的<input type="checkbox">元素创建复选框,并通过JavaScript监听其状态变化。 <input type="checkb…