资源描述:
《javascript函数柯里化的一些思考》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、1.高阶函数的坑在学习柯里化Z前,我们首先来看下面一段代码:varfl=function(x){returnf(x);};fl(x);很多同学都能看出来,这些写是非常傻的,因为函数歸和f是等效的,我们宜接令varfl=f;就行了,完全没有必要包裹那么一层。但是,卜而一段代码就未必能够看得出问题来了:vargetServerstuff=function(callback){returnajaxCall(function(json){returncallback(json);});};这是我摘自《JS函数式编程指南》中的一段
2、代码,实际上,利用上面的规则,我们可以得illcallback与函数function(json){returncallback(json);};是等价的,所以函数可以化简为:vargetServerstuff=function(callback){returnajaxCall(callback);};继续化简:vargetServerstuff=ajaxCall;如此一来,我们发现那么氏一段程序都白写了。函数既可以当参数,乂可以当返回值,是高阶函数的一个重要特性,但是稍不留神就容易踩到坑里。2.函数柯里化(curry)言
3、归正传,什么是函数柯里化?函数柯里化(cmry)就是只传递给函数一部分参数来调用它,让它返冋一个函数去处理剩下的参数。听得很绕1丨,其实很简单,其实就是将函数的变量拆分开来调用:f(x,y,z)->f(x)(y)(z)o对于最开始的例子,按照如下实现,要传入两个参数,fl调用方式是fl(fzX)ovarfl=function(f,x){returnf(x);};注意,由于f是作为一个函数变最传入,所以门变成了一个新的函数。我们将曰变化一下,利用闭包可以写成如下形式,则現调用方式变成Tfi(f)(x),而且得到的结果完全一
4、样。这就完成了fi的柯里化。varfl=function(f){returnfunction(x){returnf(x);}};varf2=f1(f);f2(x);其实这个例子举得不恰当,细心的同学可能会发现,珂虽然是一个新函数,但是^和f是完全等效的,绕了半天,还是绕回来了。这里有一个很经典的例子:['11','ll*,•11'].map(parselnt)//[11,NaNz3]['11','ll','ll'].map(fl(parselnt))//[llz11,11]由于parselnt接受两个参数,所以直接调川会
5、冇进制转换的问题,参考“不愿相离"的文章。varf2=fl(parselnt),f2Itparselnt由原来的接受两个参数变成了只接受一个参数的新两数,从而解决这个进制转换问题。通过我们的佯包裹以后就能够运行出正确的结果了。有同学觉得这个不算柯里化的应用,我觉得还是算吧,各位同学可以一起來讨论下。3・函数柯里化进一步思考如果说上一节的例了中,我们不是直接运行f(x),而是把函数f当做一个参数,结果会怎样呢?我们来看下面这个例了:假设fl返回函数g,g的作用域指向xs,函数f作为g的参数。最终我们可以写成如下形式:var
6、fl=function(f,xs){returng.call(xs,f);};实际上,用fl来替代g.call(xxx)的做法叫反柯里化。例如:varforEach=function(xs,f){returnArray.prototype・forEach.call(xs,f);};varf=function(x){console・log(x);};varxs={0:1peng1,1:1chen1,length:2};forEach(xs,f);反curring就是把原來已经固定的参数或者this上下文等当作参数延迟到未來
7、传递。它能够在很大程度上简化换数,前提是你得习惯它。抛开反柯里化,如果我们要柯里化fl怎么办?使用闭包,我们可以写成如下形式:varfl=function(f){returnfunction(xs){returng・call(xszf);}};varf2=f1(f);f2(xs);把f传入fl中,我们就可以得到f2这个新函数。只传给两数一部分参数通常也叫做局部调用(partialapplication),能够人量减少样板文件代码(boilerplatecode)o当然,函数fl传入的两个参数不一定非得包含函数+非函数,可
8、能两个都是函数,也可能两个都是非函数。我个人觉得柯里化并非是必须的,而不熟悉的同学阅读起來可能会遇到麻烦,但是它能帮助我们理解JS小的函数式编程,更重要的是,我们以后在阅读类似的代码吋,不会感到陌生。知乎上罗宸同学讲的挺好:并非“柯里化”对函数式编程有总义。而是,函数式编程在把函数当作一等公民的同时,就不可避免的会产