将命名函数传递给 Javascript 的高阶函数的正确方法是什么?
What's the proper way of passing named functions to Javascript's 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
的调用都会 return [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 函数式编程的新手,如果我使用的术语不正确,请告诉我。
问题在于那些可选参数 - map
和 reduce
传递给回调,而 parseInt
和 Math.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,其中所有这些方法的设计都是为了让它们像开箱即用的那样工作。
我正在尝试使用 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
的调用都会 return [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 函数式编程的新手,如果我使用的术语不正确,请告诉我。
问题在于那些可选参数 - map
和 reduce
传递给回调,而 parseInt
和 Math.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,其中所有这些方法的设计都是为了让它们像开箱即用的那样工作。