为什么Javascript的数组映射回调需要额外的参数

时间:2015-05-01 06:28:19

标签: javascript function functional-programming

说我有:

myArray = [1,2,3];

并说我在其他地方有一个util函数:

add3 = function(val) {
   return val+3;
}

现在,如果我想将它用作地图功能的回调,我必须做这样的事情:

add3Callback = function(currentValue, index, array) {
    return add3(currentValue);
}

myArray.map(add3Callback);

最好是地图回调不需要额外的两个参数,因为现在我必须为所有我的util函数添加包装器以便将它们与map一起使用,这违背了一些原因。首先使用地图。

我在这里缺少什么?为什么这些论点有用,其他语言似乎也没有。

3 个答案:

答案 0 :(得分:6)

map为方便起见提供了这些参数,但它们不是必需的,您可以获得相同的结果:

myArray.map(add3)

如果你有一个可以接受多个参数的函数,你可以将它限制为一个参数:

myArray.map(unary(console.log))

其中:

function unary(f) {
  return function(x) {
    return f(x)
  }
}

您可以使用binaryternarynary ...

执行此操作

请注意,JS中的任何函数都不需要通过名称传递任何参数,执行:

function f(a, b, c) {
  return [a, b, c]
}

与:

相同
function f() {
  return [arguments[0], arguments[1], arguments[2]]
}

答案 1 :(得分:5)

您的回调函数不需要来接受额外的参数。 map将传递三个参数,但您的函数完全可以忽略它们,甚至不会将它们列在参数列表中。

这完全有效:

myArray.map(function (currentValue) {
    return add3(currentValue);
});

因此也是如此:

myArray.map(add3);

答案 2 :(得分:3)

您不必提供额外参数。事实上,您根本不需要提供任何参数。 JS中有arguments对象,它包含函数提供的参数信息。

slice=Function.prototype.call.bind([].slice);
function fun(){
    slice(arguments).forEach(function(x){ console.log(x);})
}

fun(1,2,3,4);

顺便说一下。 arguments是JS中的一个奇怪的对象:它表现为 arraylike 虽然不是一个数组。您可以使用[]来访问元素,例如没有forEach

所以

function add3(){
    return arguments[0]+3;
}

console.log([1,2,3].map(add3))

有效。

function add3(a,b,c,d){
    return a+3;
}

也有效,但不需要b,c,d。 如果你将它放入地图功能

function add3(a,b,c,d){
    console.log(d)
    return a+3;
}
d未使用/调用

map(),因此undefined 你可以说,这些参数是可选的,或者是" offer"使用,但没有义务这样做。

JS在这方面的行为有点像Perl