1.柯里化实现柯里化就是将一个接受多个参数的函数转换为一个接受单个参数的函数。柯里化后可以生成便利函数/偏函数//以一个实际需求为例:动态生成表列,添加到固定表列,形成一个完整的表列functioncomposeCols(a,b){a.splice(-1,0,...b);returna;}functioncurry(f){returnfunction(fixedCols){//包装器1返回函数(dynamicCols){//包装器2constfCols=JSON.parse(JSON.stringify(fixedCols));返回f(fCols,dynamicCols)}}}constcurriedFunc=curry(composeCols);constgetCompleteCols=curriedFunc([{name:'a',value:1},{name:'b',value:2}]);console.log(getCompleteCols([{"name":"c","value":3}]));//[{"名称":"a","值":1},{"名称":"c","值":3},{"名称":"b","值":2}]console.log(getCompleteCols([{"name":"d","value":4}]));//[{"name":"a","value":1},{"name":"d","value":4},{"name":"b","value":2}]//curriedFunc和getCompleteCols是两个wrapper,也可以这样理解成就是更短的“partiallyapplied”function"or"partialfunction"//getCompleteCols为下一步“生成完整表列”提供了一个方便的函数advancedcurrying//以lodash为例functionsum(a,b){returna+b;}letcurriedSum=_.curry(sum);//curriedSum包装器允许正常或以部分方式调用函数:alert(curriedSum(1,2));alert(curriedSum(1)(2));高级curry实现functionsum(a,b,c){returna+b+c;}functioncurry(func){returnfunctioncurried(...args){if(args.length>=func.length){返回函数(...参数);//返回func.apply(this,args);}else{returnfunction(...args2){returncurried.apply(this,args.concat(args2));//返回curried(...args.concat(args2));}}}}constcurriedSum=curry(sum);console.log(curriedSum(1,2,3,4));//6.可以正常调用console.log(curriedSum(1)(2,3));//6.柯里化第一个参数console.log(curriedSum(1)(2)(3));//6、全柯里化总结:柯里化通常保留能正常调用的函数,在参数个数不足时返回部分函数,??即高级柯里化通常针对参数个数固定的函数
