偏函数用法(Partial Application)偏函数用法(Partial Function Application)是指创建一个调用另外一个部分参数已经预置的函数的函数的用法。这样,它就能被别的地方,比如count 函数,以更少的参数形式来调用。我们在makeEq 函数里已经实现了这些,但是,我们并不想针对我们各种功能开发出各种版本的makeX (比如makeEqt,makeGt,makeLt等)函数。让我们来找一种方法能通用于各种形式的函数。 function applyFirst(f, a) {
return function(b) {
return f.call(null, a, b)
}
}
count([1,3,3,4,5], applyFirst(eq, 3))
现在我们不再需要一个makeEq 函数了。任何2个参数的库函数,我们都可以按这种方式调用。通过偏函数用法,使得定义即使是诸如== 这样简单功能的各种函数都变得十分有意义,我们可以在高阶函数中更容易的使用它们。 对那些超过2个参数的函数如何办呢?下面的这一版本3能让我们接受任意多的参数,高阶函数可以自己追加参数。 function apply(f) {
var args = Array.prototype.slice.call(arguments, 1)
return function(x) {
return f.apply(null, args.concat(x))
}
}
function propertyEquals(propertyName, value, obj) {
return (obj[propertyName] == value)
}
count([{name:"bob"},{name:"john"}], apply(propertyEquals, "name", "bob")) // == 1
我们预置了2个参数,“name” 和 “bob”,count 函数补足了最后一个参数来完成整个调用。偏函数用法使我们能接受各样的函数为参数,例如eq ,然后把它们用于各样的高阶函数,例如count ,以此来解决我们特定的问题。 配合ES5的 Map 和 Filter 功能函数的偏函数用法ES5里有很多非常好的高阶函数,underscore里的数量更多。让我们看看filter 函数——一个接收比较函数、过滤数组内容的函数。 // this equals [1,3,3]
[1,3,3,4,5].filter(function(num) {
return (num < 4)
})
让我们把它替换成一个可以复用的比较函数lt (less than)。 function lt(a, b) {
return (a < b)
}
[1,3,3,4,5].filter(apply(lt, 4))
看上去添加这个lt 函数的做法有点傻,但是,我们可以使用偏函数用法来创造一个很简练的比较函数,当这个比较函数变的很复杂的时候,我们就能从对它的复用过程中获得好处。 |