为什么我不将任何参数传递给地图中的函数?

时间:2018-03-05 06:43:38

标签: javascript arrays

为什么我们不必将参数传递给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);

8 个答案:

答案 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?

仅仅因为根据specmap使用 3 隐式调用b

  使用三个参数调用

callbackfn:元素的值,   元素的索引和被遍历的对象

对于数组中的每个元素,使用这些三个参数调用回调函数

    元素的
  • (在您的情况下为abc
  • 元素的
  • 索引
  • 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;
});