javascript函数表达式依赖注入本质是将可执行逻辑作为“服务”传递替换,不依赖类或构造函数,通过高阶函数+参数传递实现轻量灵活的逻辑解耦,适用于工具函数、中间件、策略模式等场景。

JavaScript 中函数表达式作为参数实现依赖注入,本质是把可执行逻辑当作“服务”来传递和替换,不依赖类或构造函数,轻量灵活,特别适合工具函数、中间件、策略模式等场景。
函数表达式注入的核心逻辑
不是传实例,而是传函数本身——调用方决定执行什么逻辑,被调用方只负责执行,不关心来源。例如:
- 一个数据校验函数接收验证规则函数作为参数,而非内置固定规则
- 一个请求包装器接收拦截器函数(如日志、重试)作为参数,运行时动态组合
- 一个事件处理器接收回调函数,解耦触发与响应逻辑
典型写法:高阶函数 + 参数传递
最常见的是高阶函数形式,接收函数表达式并返回新行为:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
直接传入:
fetchWithRetry(url, () => fetch(url)) -
预设组合:
const loggedFetch = withLogger(fetch),其中withLogger是返回新函数的工厂 -
链式注入:
pipe(fetch, withTimeout(5000), withCache())(url),每个函数表达式处理前/后逻辑
与类构造注入的区别和优势
函数表达式注入不涉及实例生命周期、单例管理或反射解析,因此:
- 无需容器注册,无运行时解析开销
- 天然支持闭包捕获上下文(如配置、token),比对象属性更简洁
- 测试时只需传入模拟函数(
jest.fn()或箭头函数),无需 mock 类实例 - 适合无状态、纯逻辑模块,比如格式化、转换、断言等工具层
注意事项:避免隐式依赖和作用域陷阱
函数表达式虽灵活,但容易隐藏依赖或引发闭包问题:
- 避免在函数体内直接引用外部变量(如
config.apiBase),应显式作为参数传入或通过闭包固化 - 不要让注入的函数依赖未声明的全局状态,否则难以复现和测试
- 若函数需多次调用且内部有状态(如计数器),注意是否应封装为工厂函数,而非裸函数表达式
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










