柯里化通过分离固定与变动参数提升函数复用性,支持手动封装、通用curry函数及占位符灵活跳过,典型应用包括http请求封装、表单验证器生成和事件处理器预设。

柯里化在 JavaScript 中实现参数复用,本质是把“固定一部分、变动另一部分”的逻辑显式分离出来,让函数调用更专注、更可预测。它不是为了写得更炫,而是让重复传参的场景变少、定制化函数生成更直接。
用闭包固化初始参数
最直观的方式是手动封装:把确定的参数提前传入,返回一个只等剩余参数的新函数。
- 比如日志前缀固定为 "API",后续只需传具体消息:const logApi = msg => console.log("API:", msg);
- 再如校验邮箱格式,正则规则不变,只变待校验字符串:const isEmail = str => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(str);
- 这种写法轻量、无依赖,适合参数少且逻辑明确的场景
通用 curry 函数自动适配任意函数
当函数参数多、调用方式不固定时,手写容易出错,推荐用通用柯里化函数统一处理:
- 核心靠 fn.length 判断形参个数,每次调用累积参数,够了才执行原函数
- 支持多种传参风格:可以 curried(1)(2)(3),也能 curried(1, 2)(3) 或 curried(1)(2, 3)
- 保留 this 上下文,避免方法调用时丢失绑定(例如数组方法或类实例方法)
结合占位符做灵活参数跳过
真实业务中常需“先定第1个、再定第3个,中间留空”,这时基础柯里化不够用:
- 引入占位符(如 _),标记“此处暂不传”:curry(fetch)(baseUrl, _)(id)
- 内部需统计非占位符参数数量,直到满足原函数要求才触发执行
- Lodash 的 _.curry 已内置该能力,可直接使用,省去自己维护边界逻辑
典型复用场景举例
参数复用的价值,在具体用途中一目了然:
- HTTP 请求封装:const getUser = curry(fetchUser)("https://api.example.com"); 后续调用 getUser("123") 自动带上 base URL
- 表单验证器生成:const validateMinLength = curry(validateLength)(5); 一行代码产出“至少5字符”的校验函数
- 事件处理器预设:const handleClick = curry(handleAction)("delete"); 绑定到按钮时只需传 event,动作类型已锁定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











