函数式编程基础---高阶函数和偏函数
一、高阶函数
所谓高阶函数是指可一把函数作为参数,或者是可以将函数作为返回值的函数(我们见得闭包函数就是高阶函数)。
function foo(x){ return function(){ return x; } }
对于程序的编写,高阶函数比普通函数要灵活的多,除了通常意义的函数调用返回外,还形成了一种后续传递风格的结果接收方式,而非单一的返回值形式,后续传递风格的程序编写将函数的业务重点从返回值转移到了回调函数中:
function(x,bar){ return bar(x); }
以上的代码为例,对于相同的foo()函数,传入的bar的参数不同,则可以得到不同的结果。结合Node提供的最基本的事件模块可以看到,事件的处理方式就是基于高阶函数的特性来完成的。
高阶函数在JS中的应用比比皆是,其中ECMAScript5中提供的一些数组方法就是典型的高阶函数,比如:forEach()、map()、reduce()、reduceRight()、filter()、every()、some()等。
二、偏函数
偏函数用法是指创建一个调用另一个部分——参数或变量已经预置的的函数——的函数的用法。(好拗口,我也不懂),先看看例子。
普通方法:
var toString=object.prototype.toString; var isString=function(obj){ return toString.call(obj)=='[object String]'; }; var isFunction=function(obj){ return toString.call(obj)=='[object Function]'; };
.......... 偏函数方法: var isType=function(type){ return function(obj){ return tostring.call(obj)=='[object ' + type+ ' ]'; } }
上面的例子中,用偏函数方法去除了冗余代码,解决了重复定义的问题。这种通过指定部分参数来产生一个新制定的函数的形式就是偏函数。
偏函数应用在异步编程中也十分常见,著名的类库Underscore提供的after()方法既是偏函数应用,其定义如下:
_.after=function(times,func){ if(times<=0) return func(); return function(){ if(--times<1){return func.apply(this,arguments)}; } }
这个函数可以根据传入的times参数和具体的方法,生成一个需要调用多次才能真正执行实际函数的函数。