跳到正文

手写练习/函数

GitHub

手写 curry

中等函数式闭包

代码实现

JavaScript28 行
/*
  add(1, 2, 3); 普通调用:一次性传 3 个参数
  柯里化后:可以拆成多次调用的链条
  curriedAdd(1)(2)(3); // 6
  每次调用返回的都是一个新函数,这个新函数记住之前传过的参数,继续等待剩余参数,直到参数收齐后才真正执行。
*/

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    }

    return function (...nextArgs) {
      return curried.apply(this, args.concat(nextArgs));
    };
  };
}

function add(a, b, c) {
  return a + b + c;
}

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