首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议67:套用函数

关灯直达底部

套用是JavaScript函数一个很有趣的应用。所谓套用就是将函数与传递给它的参数相结合,产生一个新的函数。在函数式编程中,函数本身也是一个值,这种特性允许用户以有趣的方式去操作函数值。例如,在下面代码中定义一个add函数,该函数能够返回一个新的函数,并把参数值传递给这个新函数,从而实现连加操作。


var add=function(n){

return function(m){

return n+m;

}

}

document.writeln(add(2)(3));//5


当然,也可以为JavaScript扩展一个curry方法,实现函数的套用应用。


Function.prototype.method=function(name,func){

if(!this.prototype[name]){

this.prototype[name]=func;

return this;

}

};

Function.method('curry',function{

var slice=Array.prototype.slice;

var args=slice.apply(arguments),that=this;

return function{

return that.apply(null,args.concat(slice.apply(arguments)));

};

});


curry方法通过创建一个保存原始函数和被套用函数的参数的闭包来工作。该方法返回另一个函数,该函数被调用时会返回调用原始函数的结果,并传递调用curry时的参数加上当前调用的参数的所有参数。curry使用Array的concat方法连接两个参数数组。但由于arguments数组并非一个真正的数组,所以它并没有concat方法,要避开这个问题,必须在两个arguments数组上都应用数组的slice方法,这样才会产生出拥有concat方法的常规数组。

下面就来应用curry方法,通过curry方法调用add函数,会返回一个新的函数add1,在这个新的返回函数中保存了调用add函数时传递的值,当调用add1函数时,将新旧函数的参数进行相加,返回7。


var add=function{

var i,sum=0;

for(i=0;i<arguments.length;i+=1){

sum+=arguments[i];

}

return sum;

};

var add1=add.curry(2);

document.writeln(add1(3));//7