JavaScript模式-Curry
2015-02-11 本文已影响294人
Rockiez
当执行部分应用时,并不会获得结果,相反会获得另一个函数。-《模式》p83
Curry化允许我们把函数与传递给他的参数相结合,产生一个新的函数。-《精粹》p43
function curry(){
var slice = Array.prototype.slice,
args = slice.apply(arguments),
that=this;
return function(){
return that.apply(null,args.concat(slice.apply(arguments)));
};
}
-《精粹》p43
添加Function
的原型方法。使得函数可以调用方法的形式使用curry
。
缺点:会污染内置的原型。
function curry(fn){
var slice = Array.prototype.slice,
args = slice.call(arguments, 1);
return function() {
return fn.apply(null,args.concat(slice.apply(arguments)));
}
}
-《模式》p85
将函数做为参数引入curry
函数中。因为第一个参数为了留给了函数。slice
方法从第二位开始。注意这里用的是call
。
apply()
方法的第一个参数为null
或者undefined
时,this指向全局对象。-《模式》p82
call()
方法被认为是apply()
方法的语法糖,主要用在函数只有一个参数时。避免apply()
函数创建只有一个参数的数组。-《模式》p82
缺点:使用起来比较麻烦。
arguments
并不是一个数组,所以他没有concat方法。所以必须在两个argument
上都应用数组的slice
方法。这样产生拥有concat方法的数组。-《精粹》p43