函数表达式是 JavaScript 中实现装饰器模式最自然、灵活的方式,它通过高阶函数封装装饰逻辑,支持组合复用、闭包配置、异步处理及与类装饰器协同。

函数表达式是 JavaScript 中实现装饰器模式最自然、灵活的方式之一,它让装饰逻辑可组合、可复用,且不侵入原始函数。
用函数表达式封装装饰逻辑
装饰器本质是一个接收函数并返回新函数的高阶函数。函数表达式写法简洁,便于链式调用和动态构建:
- 避免命名污染,适合一次性或局部使用的装饰逻辑
- 支持闭包,能携带配置参数(如日志前缀、重试次数)
- 返回的新函数可直接赋值、传参或继续被其他装饰器包裹
例如,一个带时间戳的日志装饰器可写为:
const withLog = (fn, prefix = 'call') => (...args) => {console.log(`[${new Date().toISOString()}] ${prefix}`, args);
return fn(...args);
};
多个装饰器的顺序组合
函数表达式天然适配“函数式组合”,通过嵌套或工具函数(如 compose)控制执行顺序:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 从右到左应用:最右边的装饰器最先执行(接近原始函数)
- 每个装饰器只关注单一职责,比如校验 → 缓存 → 日志 → 执行
- 组合时无需修改原函数,也不依赖类或 this 绑定
示例:
const composed = withLog(withCache(withAuth(apiRequest)));支持异步与 Promise 装饰
现代装饰常涉及异步操作(如权限检查、加载状态)。函数表达式可统一处理同步/异步函数:
- 内部用 await 或 Promise.resolve() 保持接口一致
- 错误捕获逻辑可集中封装,避免每个函数重复 try/catch
- 返回 Promise 的装饰器仍可被其他装饰器叠加
例如防抖装饰器:
const debounce = (fn, delay) => {let timer;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
};
与 class 装饰器的协同使用
虽然 ES 标准装饰器语法主要面向类,但函数表达式装饰器可无缝增强类方法:
- 对类中方法单独装饰,不改变类定义本身
- 装饰后的方法仍保留 this 上下文(注意箭头函数陷阱)
- 可在实例化后动态挂载,适合插件化扩展
例如给某个实例方法添加重试机制:
obj.loadData = withRetry(obj.loadData, { maxRetries: 3 });

















