当前位置:首页 > JavaScript

js 装饰器实现防抖

2026-01-31 06:54:13JavaScript

防抖装饰器的实现原理

防抖(Debounce)是一种常见的前端优化技术,用于限制函数在短时间内被频繁调用。装饰器(Decorator)是 JavaScript 的一种语法特性,可以方便地修改或增强函数的行为。

基础防抖装饰器实现

function debounce(delay) {
  let timer = null;
  return function(target, name, descriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args) {
      clearTimeout(timer);
      timer = setTimeout(() => {
        originalMethod.apply(this, args);
      }, delay);
    };
    return descriptor;
  };
}

使用示例

class SearchComponent {
  @debounce(300)
  handleSearch(query) {
    console.log('Searching for:', query);
    // 实际搜索逻辑
  }
}

立即执行版本

有时需要第一次调用立即执行,后续调用才防抖:

function debounce(delay, immediate = false) {
  let timer = null;
  return function(target, name, descriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args) {
      if (immediate && !timer) {
        originalMethod.apply(this, args);
      }
      clearTimeout(timer);
      timer = setTimeout(() => {
        if (!immediate) {
          originalMethod.apply(this, args);
        }
        timer = null;
      }, delay);
    };
    return descriptor;
  };
}

取消功能扩展

为防抖函数添加取消能力:

function debounce(delay) {
  let timer = null;
  return function(target, name, descriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args) {
      clearTimeout(timer);
      timer = setTimeout(() => {
        originalMethod.apply(this, args);
      }, delay);
    };

    // 添加取消方法
    descriptor.value.cancel = function() {
      clearTimeout(timer);
      timer = null;
    };

    return descriptor;
  };
}

TypeScript 版本实现

function debounce(delay: number): MethodDecorator {
  return function(
    target: Object,
    propertyKey: string | symbol,
    descriptor: PropertyDescriptor
  ) {
    const originalMethod = descriptor.value;
    let timer: number | null = null;

    descriptor.value = function(...args: any[]) {
      if (timer) {
        clearTimeout(timer);
      }
      timer = setTimeout(() => {
        originalMethod.apply(this, args);
        timer = null;
      }, delay);
    };

    return descriptor;
  };
}

注意事项

装饰器目前是 ECMAScript 的提案阶段特性,需要使用 Babel 插件 @babel/plugin-proposal-decorators 进行转译。在 TypeScript 中需要在 tsconfig.json 中启用 experimentalDecorators 选项。

js 装饰器实现防抖

防抖时间间隔需要根据实际场景调整,通常用户输入场景建议 300ms 左右,滚动事件可能更短。

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

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js节流实现

js节流实现

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

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…