我需要帮助逐行分解这个例子中发生的事情(来自Eloquent Javascript的摘录):
我们有forEach函数,它记录数组中的每个项目。我理解这是如何运作的。
function forEach(array, action) {
for (var i = 0; i < array.length; i++)
action(array[i]);
}
所以我们有一个名为'numbers'的数组和另一个名为'sum'的变量设置为0。 我迷路的地方是'function(number)'传递给action参数的时候。这是做什么的,它是如何工作的?我不明白它的价值是什么。有人可以打破这个吗?
var numbers = [1, 2, 3, 4, 5], sum = 0;
forEach(numbers, function(number) {
sum += number;
});
console.log(sum);
// → 15
答案 0 :(得分:0)
我认为你没有理解这个电话的句法结构。人们可以同样写
var numbers = [1, 2, 3, 4, 5];
var sum = 0;
function addToSum(number) {
sum += number;
}
forEach(numbers, addToSum);
我希望很清楚这里发生了什么。我们有一个函数addToSum
,并将该函数传递给forEach
函数 - 我们通过参数名称action
引用它,并将其与传递的数组的每个元素一起调用它循环体:action(array[i])
。关于这种抽象的大部分内容是我们可以将任意函数传递给forEach
...
那么现在这个奇怪的语法是什么?首先,它正在取代function declaration by a function expression。函数表达式只是一个求值为函数对象的表达式,就像数组文本[1, 2, 3, 4, 5]
求值为数组对象一样。它也被称为匿名函数,因为它没有名称。我们取这个值并将其分配给变量:
var numbers = [1, 2, 3, 4, 5];
var sum = 0;
var addTosum = function(number) {
sum += number;
}
forEach(numbers, addToSum);
直到这里才真正改变。现在,为什么我们需要这个变量?我们实际上并不需要那些指向我们使用表达式创建的值的标识符。我们现在只是将表达式直接放在forEach
函数调用中 - 仍然传递相同的值(forEach
没有发现差异):
var sum = 0;
forEach([1, 2, 3, 4, 5], function(number) {
sum += number;
});