大家好,我是进阶学习者。1.什么是柯里化?柯里化是一种关于函数的高级技术。它不仅用于JavaScript,还用于其他编程语言。柯里化是函数的一种转换,指的是将函数从可调用的f(a,b,c)转换为可调用的f(a)(b)(c)。柯里化不调用函数。它只是转换功能。2.示例:将创建一个辅助函数curry(f),它将对两个参数的函数f执行柯里化。换句话说,对一个有两个参数的函数f(a,b)执行curry(f)会将它变成一个以f(a)(b)运行的函数:functioncurry(f){//curry(f)Executecurried转换returnfunction(a){returnfunction(b){returnf(a,b);};};}//使用函数sum(a,b){returna+b;}letcurriedSum=curry(sum);alert(curriedSum(1)(2));//3运行结果:注:如你所见,实现非常简单:只有两个包装器。curry(func)的结果是一个包装函数(a)。当它像curriedSum(1)一样被调用时,它的参数被保存在词法环境中,并返回一个新的包装器function(b)。然后使用2作为参数调用此包装器,并将该调用传递给原始sum函数。3.目的是什么?它有什么好处?示例:要理解,需要一个实际示例。有一个日志功能log(date,importance,message)用于格式化和输出消息。在实际项目中,此类函数有很多有用的功能,比如通过网络发送日志(log),这里只使用alert:functionlog(date,importance,message){alert([${date.getHours()}:${date.getMinutes()}][${importance}]${message});}让它成为咖喱!日志=_.咖喱(日志);柯里化后,日志仍然正常运行:log(newDate(),"DEBUG","somedebug");//log(a,b,c)runningresults:...但也可以以柯里化形式运行:log(newDate())("DEBUG")("somedebug");//log(a)(b)(c)结果:现在,您可以轻松地为当前日志创建一个方便的函数://logNow将是带有固定第一个参数的日志的部分函数letlogNow=log(newDate());//使用它logNow("INFO","message");//[HH:mm]INFOmessage固定的第一个参数,换句话说,更多“部分应用功能”或“部分”的缩写。你可以更进一步,为当前调试日志提供一个方便的函数:letdebugNow=logNow("DEBUG");debugNow("message");//[HH:mm]DEBUGmessage注意:柯里化后,什么都没有丢失:log仍然可以正常调用。偏函数,比如生成今天日志的偏函数,可以轻松生成。4.高级柯里化实现下面是多参数函数的“高级”柯里化实现,也可以用在上面的例子中。函数curry(func){返回函数curried(...args){if(args.length>=func.length){returnfunc.apply(this,args);}else{返回函数(...args2){returncurried.apply(this,args.concat(args2));}}};}例子:functionsum(a,b,c){returna+b+c;}letcurriedSum=curry(sum);alert(curriedSum(1,2,3));//6,仍然可以正常调用alert(curriedSum(1)(2,3));//6,柯里化了第一个参数alert(curriedSum(1)(2)(3));//6、Fullcurrying运行结果:五、总结本文基于JavaScript基础,介绍Currying功能。柯里化是一种将f(a,b,c)转换为可以称为f(a)(b)(c)的东西的转换。JavaScript实现通常保持函数可正常调用,如果参数个数不足则返回部分函数。柯里化函数可以更容易地获得部分函数。具体情况逐案分析。代码很简单,希望对大家学习有所帮助。本文转载自微信公众号《前端进阶学习交流》,可通过以下二维码关注。转载本文请联系前端进阶学习交流公众号。
