柯里化函数是将多参数函数转换为一系列单参数函数,通过闭包预置参数并延迟执行,支持占位符、上下文绑定及缓存优化,适用于API封装等场景。

柯里化函数的核心是把一个接收多个参数的函数,转换成一系列每次只接收一个参数的函数。动态生成定制化函数,关键在于“按需预置参数”和“延迟执行”,而不是写死逻辑。
用闭包捕获预设参数
最直接的方式是利用闭包保存已传入的参数,返回新函数等待剩余参数:
- 每次调用都返回一个新函数,该函数记住之前传入的参数(用数组或 arguments-like 结构暂存)
- 当累积参数数量达到原函数期望的总参数个数时,自动触发执行
- 示例:实现通用 curry 工具函数
const arity = fn.length;
return function curried(...args) {
if (args.length >= arity) return fn(...args);
return (...rest) => curried(...args, ...rest);
};
}
支持占位符与灵活参数顺序
真实场景中常需跳过某些参数(如用 _ 占位),这时不能只靠参数长度判断,得显式标记“未完成”状态:
- 引入占位符(如 _),遇到它就留空,不计入已提供参数计数
- 内部维护一个“参数槽位数组”,填满后再执行
- 可结合 Symbol 或唯一对象做占位符,避免字符串冲突
按需绑定上下文与重用逻辑
定制化不仅指参数,还包括 this 绑定和复用策略:
立即学习“Java免费学习笔记(深入)”;
- 用 Function.prototype.bind 可快速实现部分绑定,但无法动态调整占位符
- 若需保持 this 上下文(比如用于 class 方法),应在闭包中显式保存 this 或用箭头函数规避
- 对高频调用场景,可缓存已生成的定制函数,避免重复构造
实际定制化例子:API 请求封装
比如封装 fetch,固定 base URL 和 headers,动态传入 path 和 body:
const api = curry((baseUrl, headers, path, body) =>fetch(`${baseUrl}${path}`, { method: 'POST', headers, body })
);
// 生成专用函数
const githubApi = api('https://api.github.com')({ Accept: 'application/vnd.github.v3+json' });
const createIssue = githubApi('/repos/owner/repo/issues');
这样每层调用都在构建更具体的函数,语义清晰、可组合、易测试。


















