说我有:
myArray = [1,2,3];
并说我在其他地方有一个util函数:
add3 = function(val) {
return val+3;
}
现在,如果我想将它用作地图功能的回调,我必须做这样的事情:
add3Callback = function(currentValue, index, array) {
return add3(currentValue);
}
myArray.map(add3Callback);
最好是地图回调不需要额外的两个参数,因为现在我必须为所有我的util函数添加包装器以便将它们与map一起使用,这违背了一些原因。首先使用地图。
我在这里缺少什么?为什么这些论点有用,其他语言似乎也没有。
答案 0 :(得分:6)
map
为方便起见提供了这些参数,但它们不是必需的,您可以获得相同的结果:
myArray.map(add3)
如果你有一个可以接受多个参数的函数,你可以将它限制为一个参数:
myArray.map(unary(console.log))
其中:
function unary(f) {
return function(x) {
return f(x)
}
}
您可以使用binary
,ternary
,nary
...
请注意,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。