当前位置:首页 > 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实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

节流js实现

节流js实现

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