为什么我们不必将参数传递给function b
在下面的代码?是因为我们使用的是Array类型的map方法吗?或者在其他地方我们可以使用这样的功能
JavaScript的?
有人可以给出一个非常简洁的解释吗?
代码:
/* we have an array a*/
const a = ['a', 'b', 'c'];
/*we define a function called b to process a single element*/
const b = function(x){do something here};
/*I noticed that if we want to use function b to take care with the
elements in array a. we just need to do the following.*/
a.map(b);
答案 0 :(得分:11)
函数是Javascript中的一等公民,这只是说它们可以作为变量和参数传递的一种奇特方式。
致电时正在做什么
a.map(b);
本质上是在呼叫
[
b('a'),
b('b'),
b('c')
]
数组函数map
只是使用数组中的每个参数调用给定函数(在您的情况下为b
),并将输出放在一个新数组中。所以有些论据被传递给b
,只是map
正在幕后为你做这件事。
至于你的其他问题,有很多情况下你会将函数作为参数传递而不先调用它。另一个常见功能是Array对象的reduce
。
const out = a.reduce(function (accumulator, val) {
return accumulator + ' - ' + val;
}
// out: 'a - b - c'
许多函数也会进行回调,这些回调在某种异步任务完成时调用。例如。 setTimeout
,将在经过的时间后调用给定的函数。
setTimeout(function (){
console.log("Hello World!");
}, 1000
);
// Will print "Hello World!" to console after waiting 1 second (1000 milliseconds).
你也可以轻松编写你的函数来将另一个函数作为参数!只需调用您传入的函数,就像调用任何其他函数一样。
// A really basic example
// More or less the same as [0, 1, 2].map(...)
function callThreeTimes(f) {
return [
f(0),
f(1),
f(2)
]
}
// My function here returns the square of a given value
function square(val) { return val * val }
const out = callThreeTimes(square);
// out: [0, 1, 4]
答案 1 :(得分:7)
您不会将参数传递给b
,因为您没有将其称为。您将函数本身作为值传递。
这里使用map
是无关紧要的;你可以直接看到发生了什么:
const a = function(x) { alert(`called with ${x}`); };
// The function is NOT called here; it's just being assigned,
// like any other kind of value. This causes "b" to become
// another name for "a".
// This is NOT the same as a(), which would call the function
// with undefined as the argument.
const b = a;
// Now we call it, and the alert happens here
b(5);
将函数传递给另一个函数的方式相同,因为它只是另一种赋值形式。
这很有用,因为即使您自己不知道参数是什么,您也可以告诉其他代码 如何做某事。在map
的特定情况下,它会为您循环遍历数组,并为每个元素调用一次函数。您不希望想要调用您传递给map
的函数,因为map
的全部目的是为您调用该函数。
答案 2 :(得分:4)
map接受函数作为参数,并为数组的每个元素执行提供的函数。 这里传递函数 b 作为映射参数,因此map对数组 a 的每个元素执行函数 b 。 所以你不需要在这里传递参数 b ,map会处理这个。
答案 3 :(得分:1)
为什么我们不必在这里将参数传递给函数b?
仅仅因为根据spec,map
使用 3 隐式调用b
。
使用三个参数调用callbackfn:元素的值, 元素的索引和被遍历的对象
对于数组中的每个元素,使用这些三个参数调用回调函数
a
,b
和c
)b
本身(正在遍历的对象)。答案 4 :(得分:1)
为什么没有括号?
当您将函数作为参数传递给sort方法时,它在函数名后面没有括号。这是因为函数不应该被调用,而是在那里而是map方法来引用这个函数,以便它可以在尝试映射数组时根据需要调用它。
为什么它不接受任何争论?
现在我们知道map会相应地调用这个回调函数,所以当map调用它时,它会在调用它时隐式地将参数传递给它。
例如,如果这是sort的回调,那么传递的参数将是当前元素和下一个元素。如果这是map的回调,则参数将是当前值,index,array。
答案 5 :(得分:0)
您可能听说过javascript中的函数是一等公民。
如果您查看来自MDN map的文档,您会注意到map函数接受最多包含3个参数的回调,首先是currentValue
所以让我们分解吧。在上面的数组上做一个映射的一个非常明确的例子就是这个
a.map(function(currentValue, index, array){
// here you can access the 3 parameters from the function declaration
});
在数组的每次迭代中调用此函数。由于函数在javascript中非常灵活,因此您只能声明1个参数,甚至不能声明。
a.map(function(currentValue){
// we need only the current value
});
JavaScript中的每个函数都是一个Function对象。 Source here
这意味着每个函数只是内存中的引用,这意味着它可以直接指定为匿名函数(我们的情况就是上面的),或者像之前那样声明
function b(currentValue){
// this will be called on each item in the array
};
a.map(b)
这段代码迭代数组中的每个元素并调用我们传递的引用(函数b)。它实际上用文档中的所有3个参数调用它。
[
b('a',0,a),
b('b',1,a),
b('c',1,a)
]
但由于我们的function b
只声明了一个,我们只能访问该值。
其他参数存储在所谓的Arguments object
从这里开始 JavaScript中的每个函数都是一个Function对象,它使每个函数都引用一个特定的内存位置,最终让我们有很大的灵活性将函数作为参数传递但是我们想要(通过匿名函数显式,或通过函数声明(引用)隐式)
答案 6 :(得分:0)
在JavaScript中,函数只是另一种类型的对象。
调用不带参数的函数如下所示。这将始终执行该函数并返回函数的返回值。
var returnValue = b();
删除括号将把函数本身视为变量,可以在其他变量,参数等中传递。
var myFunction = b;
在任何时候添加括号到"函数变量"将执行它引用的函数并返回返回值。
var returnValue = myFunction();
var sameReturnValue = b();
因此map()接受一个参数,它是一个函数类型(无括号)。然后它将为数组中的每个元素调用此函数(括号)。
答案 7 :(得分:0)
Bellow你会发现如何使用地图功能:
第一个Methode
incrementByOne = function (element) {
return element + 1;
}
myArray = [1,2,3,4];
myArray.map(incrementByOne); // returns [2,3,4,5]
Seconde方法
myArray = [0,1,2,3];
myArray.map(function (element) {
return element + 1;
}); // returns [1,2,3,4]
第三方法
myArray = [1,2,3,4];
myArray.map(element => {
return element + 1;
});