柯里化是 函数式编程 中的一个思想。
分析curry
函数:
curry
返回的是一个函数fn
;- 执行
fn
,中间状态返回的是函数,如:add(1) / add(1)(2)
; - 最后返回执行结果,如:
add(1)(2)(3)
。
function currying(fn, ...args) {
const len = fn.length; // Function.length 属性指明函数的形参个数
let allArgs = [...args]
const res = (...newArgs) => {
allArgs = [...allArgs, ...newArgs]
if (allArgs.length === len) {
// console.log('最后执行吗?')
return fn(...allArgs)
} else {
// console.log('啥时执行?')
return res
}
}
return res
}
var add = (a, b, c) => a + b + c;
var a = currying(add, 1)
a(2)(3) // 或 a(2, 3),保证形参和 add 函数所需形参个数相同
function curry(...fn) {
const fnLen = fn.length; // 传入函数的参数长度,也就是 add 函数的参数长度:3
const cacheArgs = []; // 收集参数
// 返回的函数
function calc(...args) {
// 积累参数
cacheArgs = [...cacheArgs, ...args];
// 判断参数长度
if (cacheArgs.length < fnLen) {
// 若参数长度不够 add 函数所需参数长度,则返回函数
return calc;
} else {
// 若参数长度够了,返回计算结果
return fn.apply(this, cacheArgs.slice(0, fnLen)); // slice 避免传入超长参数,超长参数无用
}
}
return calc;
}
var add = (a, b, c) => a + b + c;
var a = currying(add)
a(1)(2)(3) // 或 a(1, 2, 3),保证形参和 add 函数所需形参个数相同