【问题标题】:What's the proper way of passing named functions to Javascript's higher-order functions?将命名函数传递给 Javascript 的高阶函数的正确方法是什么?
【发布时间】:2015-02-17 15:59:25
【问题描述】:

我正在尝试使用 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 函数式编程的新手,如果我使用的术语有误,请告诉我。

【问题讨论】:

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


    【解决方案1】:

    问题在于那些可选参数 - mapreduce 传递给回调,而 parseIntMath.max 毫不关心地接受。

    您基本上需要做的是修复它们的数量,以便它们只需要一个响应。两个论点:

    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,所有这些方法都经过专门设计,可以开箱即用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多