将函数传递给另一个函数时的高阶函数说明

时间:2014-10-06 15:46:07

标签: javascript function

我需要帮助逐行分解这个例子中发生的事情(来自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

1 个答案:

答案 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;
});
相关问题