函数柯里化(Currying):将一个接收多个参数函数,转换为一系列只接受一个参数的函数的过程。即 逐个接收参数。
例子:
普通函数:
function add(a, b, c) {return a + b + c;
}
add(1, 2, 3); // 输出 6
柯里化版本:
function curriedAdd(a) {return function (b) {return function (c) {return a + b + c;};};
}
curriedAdd(1)(2)(3); // 输出 6
📌 二、柯里化函数源码详解
function curry(fn, argLength){return function curried(...args) {if(args.length >= argLength) { // 当传入的参数大于期望的参数时,即 参数个数够了return fn.apply(this, args)} else {return function(...args2){ // 当传入的参数不够时,递归调用函数,并进行拼接return curried.apply(this, args.concat(args2));}}}
}
✅ 三、逐行解释 curry 函数
🔹 function curry(fn, argLength)
-
fn
:柯里化的目标函数,如add(a, b, c)
-
argLength
:期望的参数个数
🔹 return function curried(...args) {
-
返回一个新函数
curried
,用于收集传入的参数 -
args
:当前接收到的参数集合(可能不全)
🔹 if (args.length >= argLength)
-
如果参数够了,说明我们已经收集完了所需的参数
✅ 执行目标函数:
return fn.apply(this, args)
-
调用原函数
fn
,传入完整参数args
-
使用
.apply()
是为了把数组参数展开执行
.apply( this的值,要传递给函数的参数 ) —— Function.prototype.apply
fn.apply(thisArg, [argsArray])
等价于
fn(...argsArray)
是 js 中函数的内置方法,用来"调用"一个函数,并显示指定(两个参数):
- “this”指向
- “参数数组传入方式”——> 可以是数组或者类数组对象,表示要传递给函数的参数
例子:
function sayHi(name, age){console.log(`${name} is ${age} years old.`); }sayHi.apply(null, ['Alice', 25]); // 输出 Alice is 25 years old.
🔹 else { return function(...args2) { ... }}
-
如果参数还不够,返回一个新的函数,继续收集参数
⚡ 重点:
return curried.apply(this, args.concat(args2))
-
把之前的参数
args
和现在的参数args2
合并 -
再次调用
curried
自身,形成递归
✅ 五、总结对比表
行为 | 对象 | 目的 | 触发条件 |
---|---|---|---|
fn.apply(this, args) | 原始函数 | 执行目标函数 | 参数数量足够 |
curried.apply(this, args.concat(args2)) | 柯里化函数自身 | 递归收集参数 | 参数不够 |
例题:牛客 JS56 返回函数