函数表达式作为参数本质是传递可执行逻辑而非数据,实现行为解耦与复用;常见于高阶函数、预设封装、链式组合,适用于工具函数、中间件、策略选择等场景。

函数表达式作为参数,本质是把一段可执行的逻辑当作“值”来传递和组合,不是传数据,而是传行为。它让调用方决定“怎么做”,被调用方只负责“执行什么”,从而实现逻辑解耦和复用。
核心写法:高阶函数接收函数表达式
最常见的是定义一个高阶函数,参数中包含一个或多个函数表达式:
-
直接传入:比如
validate(data, rule => rule.test(data)),rule 是校验逻辑,每次调用可换不同规则 -
预设封装:如
const cachedFetch = withCache(fetch),withCache返回新函数,内部已固化缓存行为 -
链式组合:像
pipe(apiCall, withTimeout(3000), handleErrors),每个环节都是函数表达式,顺序执行前/后处理
适用场景很明确
这类模式特别适合那些“框架固定、逻辑可变”的地方:
-
工具函数:格式化、转换、断言等无状态操作,比如
map(arr, x => x * 2) - 中间件机制:请求拦截(日志、鉴权、重试)、事件响应(点击后执行哪段回调)
-
策略选择:根据条件传入不同计算函数,如支付方式选
alipay()还是wechatPay()
关键细节不能忽略
灵活性强,但也容易埋坑:
- 避免函数体内隐式读取外部变量(比如直接用
config.baseUrl),应显式传参或用闭包固化 - 不要依赖未声明的全局状态,否则测试时难模拟、运行时难复现
- 如果函数需要维护内部状态(如计数、缓存),优先封装成工厂函数,而不是裸函数表达式
对比类注入更轻量
不用注册容器、不管理实例生命周期、不搞反射解析:
- 测试时直接传
jest.fn()或箭头函数,无需 mock 整个类 - 天然支持闭包捕获上下文(token、配置、环境变量),比对象属性更简洁自然
- 适合纯逻辑层,尤其是工具库、配置驱动型模块

















