柯里化是将接收多个参数的函数转换为一系列只接收一个参数的函数的技术,核心价值在于参数复用——提前固定部分参数生成新函数,后续调用只需传入剩余参数。
柯里化(Currying)是 JavaScript 中一种将**接收多个参数的函数**,转换为**一系列只接收一个参数的函数**的技术。它的核心价值在于参数复用——提前固定部分参数,生成新函数,在后续调用中只需传入剩余参数。
参数复用的本质是“预设”部分参数,把通用配置固化下来,避免重复传递。比
如一个加法函数 add(a, b, c),若经常要加 10 和 20,就可以柯里化成 add10and20 = add(10)(20),之后每次调用只需传第三个数:add10and20(5) → 35。
基础实现思路:返回一个递归闭包函数,累计收集参数,直到数量足够才执行原函数。
示例:
curry(fn),接收目标函数 fn
curried,用闭包保存已传参数 args
fn.length(形参个数),就执行 fn(...args)
代码简写如下:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
}
};
}
柯里化在函数式编程和工程中很实用,常见于:
handleClick = curry(handleEvent)('button'),固定事件类型,后续只需传 event 对象request(baseUrl)(token),再生成具体接口调用函数log = curry(console.log)('[API]'),后续调用自动带前缀isLongerThan = curry((min, str) => str.length > min),再生成 isNameValid = isLongerThan(2)
柯里化不是万能的,需留意:
fn.length 只反映函数声明时的形参个数,无法识别 rest 参数(...args)或动态参数arguments 和 fn.length 的可靠行为,建议对普通函数柯里化this 绑定,需显式处理(如用 bind 或箭头函数包裹)