函数柯里化(function currying),用于创建已经设置好了一个或者多个参数的函数。函数柯里化的基本方法与函数绑定是一样的:使用一个闭包返回一个函数,两者的区别在于,当函数被调用时,返回的函数还需要设置一些传入的参数。

示例:

functionadd(num1, num2){returnnum1   num2;
}functioncurriedAdd(num2){returnadd(5, num2);
}console.log(add(2,3));// 5console.log(curriedAdd(3));// 8

这段代码定义了两个函数:add() 和 curriedAdd(),后者本质上是任何情况下第一参数为5 的add() 版本,尽管技术上来说curriedAdd() 并非柯里华的函数,但它更好的展示了其概念。

柯里化函数通常由以下步骤动态创建:调用另一个函数并为他传入要柯里华的函数和必要参数。

functioncurry(fn){letargs =Array.prototype.slice.call(arguments,1);// 外部所有参数returnfunction(){letinnerArgs =Array.prototype.slice.call(arguments),// 内部所有传入的的参数finalArgs = args.concat(innerArgs);// 合并内部外部参数returnfn.apply(null, finalArgs);// 传递给fn}
}functionadd(num1, num2){returnnum1   num2;
}constcurriedAdd = curry(add,5);console.log(curriedAdd(3))// 8constcurriedAdd1 = curry(add,5,12);console.log(curriedAdd1())// 17

接受多个参数

functiontoCurry(fn){//保存回调函数returnfunctioncurry(){varargs =Array.prototype.slice.call(arguments);//判断目前入参是否达到函数要求入参if(args.length < fn.length) {returnfunction(){//递归调用curry,拼接当前arguments和下次入参的argumentsreturncurry.apply(null, args.concat(Array.prototype.slice.call(arguments)))
      }
    }else{//执行函数returnfn.apply(null, args)
    }
  }
}functionadd(a, b, c){returna   b   c
}varfn = toCurry(add);console.log(fn(1,2)(3));//6console.log(fn(1)(2)(3));//6