EloquentJavaScript。抽象数组遍历。第二版。第 83 页

Eloquent JavaScript. Abstracting Array Traversal. 2nd Ed. pg 83

我不知道这是怎么回事。这是代码。

function forEach(array, action) {
  for (var i = 0; i < array.length; i++) 
    action (array[i]);  
}
var numbers = [1, 2, 3, 4, 5], sum = 0;
forEach(numbers, function(number) {
  sum += number;
});
console.log(sum);

我知道 sum =+ number; 正在传递给 forEach 并循环遍历数组编号。但我无法弄清楚这是如何发生的细节。像这样 function(number) {sum =+ number} 代替 action

for (var i = 0; i < [1, 2, 3, 4, 5].length; i++)
  function(number) {
    sum += number;
  } (array[i]);
}

没有意义,运行也没有。什么是

var numbers = [1, 2, 3, 4, 5], sum = 0;
for (var i = 0; i < numbers.length; i++)
  sum += (numbers[i]);
debug(sum);
console.log(sum);

这是我可以压缩并使其工作的最大数量。但是你怎么到这里呢?换句话说,到底发生了什么?

感谢您的帮助。这个概念似乎是 Haverbeke 方法的基础,所以我想我最好理解它。

正确的翻译,正如@FelixKling 所说的那样(即使他没有),效果很好:

var array = numbers;
var action = function(number) {
    sum += number;
}
for (var i = 0; i < array.length; i++) {
    action(array[i]);
}

forEach 函数正在为数组中的每个元素调用 action

所有 forEach 在这里所做的就是抽象出一个循环,就像您几乎拥有的循环一样:

for (var i = 0; i < numbers.length; i++){
    sum += numbers[i];
}

也许 action (array[i]) 把你绊倒了。了解这是对数组中的元素 调用 操作,因此更直观地说它看起来像 action(array[i])

对于 foreach,此调用在代码内部处理 -- 在 action (array[i])。这就是为什么您可以只传递一个函数而无需自己调用它的原因。

一句话,forEach 通过调用您提供的数组中每个元素的函数来工作。

如果您需要另一个例子来解决这个问题,请考虑这个(假设 forEach 是您问题中的那个):

var greetings = ["Hello", "Hi", "How are ya"];

function printGreeting(greeting){
    console.log(greeting, "Greg");
}

forEach(greetings, printGreeting);

正如您在此处看到的,printGreeting 通过传递 greetings[i] 的每个值来调用 greetings 中的所有元素。

任何你想在数组上用 for 循环做的事情都可以使用 forEach 循环来完成,也许更容易。

有关详细信息,请在此处查看标准 Array.prototype.forEach()https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach