当前位置:首页 > 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 选项。

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

js 装饰器实现防抖

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

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https:/…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现计算器

js实现计算器

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