javascript - Eloquent JavaScript。抽象数组遍历。第二版。第 83 页

标签 javascript arrays traversal

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

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 方法的基础,所以我想我最好理解它。

最佳答案

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

关于javascript - Eloquent JavaScript。抽象数组遍历。第二版。第 83 页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32274032/

相关文章:

java - 将文本文件扫描到对象数组中

python - 如何填充 numpy 数组而不填充角落?

list - Prolog,在列表中找到最小值

java - 查找多维数组的所有垂直遍历

c# - 使用递归函数遍历 XML

javascript - Cckeditor 不允许使用 img 元素

javascript 错误为 null 或不是对象

javascript - 抓取对象 Javascript 内的 Nested Objects.length

javascript - onmouseup 在 safari 中不起作用

javascript - 不允许在文本框验证中使用特殊字符