* @param {Function} fn - 需要被柯里化的函数
* @param {...any} oldArgs - (内部使用) 之前已经收集的参数
function curry(fn, ...oldArgs) {
return function(...newArgs) {
const allArgs = [...oldArgs, ...newArgs];
if (allArgs.length >= fn.length) {
// 如果参数足够,则执行原始函数 fn,并返回结果
return fn.apply(this, allArgs);
// 如果参数不够,则递归调用 curry,保存当前所有参数,并返回一个等待接收更多参数的函数
return curry(fn, ...allArgs);
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 输出: 6
console.log(curriedAdd(1, 2)(3)); // 输出: 6
console.log(curriedAdd(1)(2, 3)); // 输出: 6
console.log(curriedAdd(1, 2, 3)); // 输出: 6
const add5 = curriedAdd(5);
console.log(add5(1, 2)); // 输出: 8
console.log(add5(3)(4)); // 输出: 12