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

Cam*_*all 0 javascript functional-programming function

说我有:

myArray = [1,2,3];
Run Code Online (Sandbox Code Playgroud)

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

add3 = function(val) {
   return val+3;
}
Run Code Online (Sandbox Code Playgroud)

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

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

myArray.map(add3Callback);
Run Code Online (Sandbox Code Playgroud)

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

我在这里错过了什么?为什么这些参数有用,其他语言似乎没有这样做.

elc*_*nrs 6

map 提供这些参数是为了方便,但它们不是必需的,你得到的结果与:

myArray.map(add3)
Run Code Online (Sandbox Code Playgroud)

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

myArray.map(unary(console.log))
Run Code Online (Sandbox Code Playgroud)

哪里:

function unary(f) {
  return function(x) {
    return f(x)
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以做到这一点binary,ternary,nary...

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

function f(a, b, c) {
  return [a, b, c]
}
Run Code Online (Sandbox Code Playgroud)

是相同的:

function f() {
  return [arguments[0], arguments[1], arguments[2]]
}
Run Code Online (Sandbox Code Playgroud)


dec*_*eze 5

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

这完全有效:

myArray.map(function (currentValue) {
    return add3(currentValue);
});
Run Code Online (Sandbox Code Playgroud)

因此也是如此:

myArray.map(add3);
Run Code Online (Sandbox Code Playgroud)