AOP在JS中的核心诉求是将横切关注点(如日志、权限、错误处理)从主逻辑中抽离,通过高阶函数实现before/after/around增强,无需框架即可动态织入,但需注意this绑定、异步处理及嵌套深度。

JavaScript 中的高阶函数天然适合实现轻量级 AOP(面向切面编程),无需框架也能在关键执行点插入横切逻辑,比如日志、权限校验、错误捕获或性能监控。
什么是 AOP 在 JS 中的核心诉求
AOP 的本质是把与业务主逻辑无关、但又需要在多个地方复用的“横切关注点”抽离出来,不侵入原有函数。JS 里不需要代理对象或编译期织入,靠函数包装就能完成:在目标函数执行前、后、异常时,动态附加行为。
用高阶函数实现 before / after / around
通过接收原函数和切面逻辑,返回增强后的新函数:
-
before:执行原函数前运行一段逻辑,比如参数校验或打日志
const before = (fn, beforeFn) => (...args) => { beforeFn(...args); return fn(...args); }; -
after:无论是否出错都执行,适合清理或上报
const after = (fn, afterFn) => (...args) => { const result = fn(...args); afterFn(result, ...args); return result; }; -
around:最灵活,完全控制执行时机和上下文,可决定是否调用原函数、修改参数或结果
const around = (fn, aroundFn) => (...args) => aroundFn(() => fn(...args), ...args);
实战:给 API 调用自动加 loading 和错误处理
假设有一个 fetchUser(id) 函数,希望统一加上加载状态管理与错误兜底:
立即学习“Java免费学习笔记(深入)”;
- 定义切面逻辑:
withLoading控制 UI 状态,withErrorBoundary捕获异常并提示 - 组合使用:
const safeUserFetch = around(fetchUser, withLoading(withErrorBoundary)); - 调用时仍保持原签名:
safeUserFetch(123),但内部已自动触发 loading 显示、错误弹窗等
注意事项与边界
高阶函数实现 AOP 简洁有效,但要注意几点:
- 避免过度嵌套导致调用栈过深或调试困难;可用单层包装 + 配置对象方式提升可读性
- 原函数的
this绑定可能丢失,需用fn.apply(this, args)显式传递上下文 - 异步函数需单独处理 Promise 链,
around中要 await 原函数并 catch 错误 - 不适用于需编译期静态分析的场景(如依赖注入、装饰器元数据),此时应考虑 TypeScript 装饰器或构建工具插件











