2

好的,我了解在 forEach 函数中,action 参数充当打印函数,并在数组中的每个元素上调用以下代码:

    function forEach(array, action) {
      for (var i = 0; i < array.length; i++)
             action(array[i]);
    }

    forEach(["Wampeter", "Foma", "Granfalloon"], print);

但在下一个示例中,将传递一个函数定义来代替 forEach 的 action 参数,如下所示:

    function sum(numbers) {
      var total = 0;
      forEach(numbers, function (number) {
             total += number;
      });
     return total;
    }
   show(sum([1, 10, 100]));

我迷路了。这段代码如何打印出给定数组的总和,但我无法解释它是如何做到的或它是如何工作的。问题 1:由于 number 是本地的并用于给 total 其最终值,因此如何或何时给定一个值?问题 2:total += number 如何作用于数组中的每个元素。

4

4 回答 4

1

参数number被传递到为数组中的每个元素调用的匿名函数中。number参数包含当前数组元素的值。在每次迭代期间将该值添加到全局变量total中,从而创建所有数组值的总和。然后该函数返回total

于 2013-08-09T16:07:56.657 回答
1

在另一个函数内部定义一个函数称为闭包。内部函数可以完全访问外部函数中定义的局部变量。

因此,当调用中使用action的函数执行时,这是将(参数)添加到(中的局部变量)。调用完成后,来自will 的每个数字都已添加到,并返回。forEach()total += numbernumbertotalsum()forEach()numberstotaltotal

于 2013-08-09T16:11:38.907 回答
0

您将numbers作为 forEach 的第一个参数传递,因此它将遍历该数组中的每个元素,然后您正在执行total += number;这意味着total = total + number;.

于 2013-08-09T16:12:00.330 回答
0

你可以在MDN上查看 forEach 的工作原理

或者实施它有助于理解

var each = function(array, func) {
  var aLength = array.length,
    retArr = [],
    i;
  for (i = 0; i < aLength; i++) {
    func(array[i], i, array);
  }
};

function sum(numbers) {
  var total = 0;
  each(numbers, function(number) {
    total += number;
  });
  return total;
}
console.log(sum([1, 10, 100]));

您还应该检查地图减少

对同一任务使用 reduce 如下所示

function sum(numbers) {
  return numbers.reduce(function(total, item){
    return total + item;
  });
}
console.log(sum([1, 10, 100]));

甚至没有包装功能

console.log([1, 10, 100].reduce(function(sum, num) {
  return sum + num;
}));

于 2016-04-08T07:37:39.413 回答