const add = (a, b, c) => a + b + c;
function curry(fn) {
let allArgs = [];
let len = fn.length;
// 闭包:访问函数外的变量allArgs
// 通过闭包,将每次的参数保存在allArgs数组中
return function next(...args) {
// 收集每次的参数
allArgs = allArgs.concat(args);
if (allArgs.length >= len) {
// 清空allArgs数组
let temp = allArgs
allArgs = []
// 所有参数拼接完,运行add函数
return fn(...temp)
} else {
// 参数未接受完,继续接受参数
return next;
}
}
}
let curriedAdd = curry(add)
console.log(curriedAdd(1, 2)(3)) // 6
console.log(curriedAdd(1)(2)(3)) // 6
console.log(curriedAdd(1)(2, 3)) // 6