当前位置:首页 > 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: 防抖延迟时间(毫秒)
  • 每次调用都会清除之前的定时器,重新计时

立即执行版本

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

js 实现防抖

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实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…

js实现视口

js实现视口

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

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…