将命名函数传递给Javascript的高阶函数的正确方法是什么?

时间:2015-02-17 07:50:34

标签: javascript functional-programming higher-order-functions

我尝试使用Javascript的高阶函数进行函数式编程。但是,它们产生了意想不到的结果:

['1','2','3','4'].map(parseInt) // [1, NaN, NaN, NaN]

['1','2','3','4'].map(function(x){
    return parseInt(x)
}) // [1, 2, 3, 4]

我预计这两次调用Array.prototype.map都会返回[1, 2, 3, 4]。如何在不使用匿名函数的情况下映射parseInt()

同样,我希望以下两个表达式产生相同的值:

[4,6,8,3].reduce(Math.max,-Infinity) // NaN

[4,6,8,3].reduce(function(x,y){
    return Math.max(x,y)
},-Infinity) // 8

另外,由于我是Javascript函数式编程的新手,如果我使用的任何术语不正确,请告诉我。

1 个答案:

答案 0 :(得分:4)

问题是那些可选参数 - mapreduce传递给回调,parseIntMath.max无法接受。

你基本上需要做的是修复他们的arity,这样他们只需要一个resp。两个论点:

Function.prototype.ofArity = function(n) {
    var fn = this, slice = Array.prototype.slice
    return function() {
        return fn.apply(null, slice.call(arguments, 0, n));
    };
};

['1','2','3','4'].map(parseInt.ofArity(1)) // Array [1, 2, 3, 4]
[4,6,8,3].reduce(Math.max.ofArity(2), -Infinity) // 8

您可能还想查看Ramda,其中所有这些方法都经过精心设计,以便它们能够像开箱即用一样工作。