雄辩的JavaScript。抽象数组遍历。第二版第83页

雄辩的JavaScript。抽象数组遍历。第二版第83页,javascript,arrays,traversal,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); 没有意义,也不会运行。有

我搞不懂这是怎么回事。这是密码

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);
没有意义,也不会运行。有效的方法是

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);
var数=[1,2,3,4,5],和=0;
对于(变量i=0;i
这是我能压缩它并使它工作的最大量。但是你怎么到这里?换句话说,到底发生了什么


谢谢你的帮助。这一概念似乎是哈弗贝克方法的基础,因此我想我最好能更好地理解它。

正如@FelixKling所说的(即使他没有)一个恰当的翻译很好:

var array = numbers;
var action = function(number) {
    sum += number;
}
for (var i = 0; i < array.length; i++) {
    action(array[i]);
}
var数组=数字;
变量动作=函数(编号){
总和+=数字;
}
对于(var i=0;i
forEach
函数正在为数组中的每个元素调用
操作

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

for (var i = 0; i < numbers.length; i++){
    sum += numbers[i];
}
正如您在这里看到的,
printGreeting
通过传递
greetings[i]
的每个值,在
greetings
中的所有元素上被调用

使用数组上的for循环可以做任何事情,使用
forEach
循环可能更容易


有关更多信息,请查看标准的
Array.prototype.forEach()
此处:

您的第二个版本不工作,因为它有语法错误。如果在函数定义周围放置
(…)
,则它会起作用。看来你明白发生了什么,让你困惑的是函数声明和函数表达式。@Andreas:你知道我的意思:P(已修复)我同意@Felix-你不能将值传递到函数声明中,但你可以将值传递到定义定义的值中(即函数本身)。在函数周围放上括号,可以将其视为一个表达式而不是一个声明mmh no,这不起作用,也不是我建议的:P(但是,是的,我错过了
数组
部分)。它必须是
(function(){…}(…)(function(){…})(…),felix@FelixKling谢谢你的回复。不知道把括号放在哪里。我尝试了各种配置。没用,但也许我没有完全明白你的意思。你的前几句话让我明白了发生了什么。现在,如果我能记住并理解这个想法,也就是说,记住并理解它。如果你对答案感到满意,你能点击“检查”按钮接受它吗?这表明你还没有找到答案。(我也想看看会发生什么):)
for (var i = 0; i < numbers.length; i++){
    sum += numbers[i];
}
var greetings = ["Hello", "Hi", "How are ya"];

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

forEach(greetings, printGreeting);