柯里化是将多参数函数改造为单参数链式调用的形式,如f(a,b,c)→f(a)(b)(c),依托闭包记忆参数、函数返回函数实现延迟执行;支持参数复用、高阶函数适配与配置化分步调用。
JavaScript 柯里化,就是把一个接收多个参数的函数,改造成每次只接收一个参数、返回新函数的形式,比如把 f(a, b, c) 变成 f(a)(b)(c)。它不立即执行原函数,而是通过闭包“记住”已传入的参数,等所有参数齐备后再真正计算。
依赖两个关键特性:
a),即使外层函数已执行完毕;当你有一组固定参数反复使用时,柯里化能提前“锁定”它们,生成更专用的函数。例如校验字符串是否含数字:
function check(reg, txt) { return reg.test(txt); }
const hasNumber = check.bind(null, /\d+/g); // 或用 curry
console.log(hasNumber('abc123')); // true
console.log(hasNumber('hello')); // false
这样就不用每次写 check(/\d+/g, ...),避免出错且语义更清晰。
在 map、filter、reduce 等场景中,柯里化让通用工具函数更容易嵌入数据流。例如提取对象数组的某个字段:
const prop = (key) => (obj) => obj[key];
const names = [{name: 'Alice'}, {name: 'Bob'}].map(prop('name'));
// → ['Alice', 'Bob']
比起写匿名函数 item => item.name,prop('name') 更具可读性与复用性,也便于后续组合其他操作。
像 ajax(method)(url)(data) 这类设计,允许你按需组装行为:
const post = ajax('POST');
固定接口地址:const userApi = post('/api/users');
userApi({id: 1});
这种分层封装让接口调用更可控,也方便单元测试和 Mock 替换。