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

High order functions explanation when passing a function to another function

本文关键字:函数 高阶 说明 另一个      更新时间:2023-09-26

我需要帮助逐行分解这个例子中发生的事情(摘录自Eloquent Javascript):

我们有forEach函数,它记录数组中的每个项。我明白这是怎么回事。

function forEach(array, action) {
  for (var i = 0; i < array.length; i++)
  action(array[i]);
}

因此,我们有一个名为"numbers"的数组,另一个称为"sum"的变量设置为0。当"function(number)"被传递到操作参数中时,我会迷失方向。它做什么?它是如何工作的?我看不出它有什么价值。有人能把它分解一下吗?

var numbers = [1, 2, 3, 4, 5], sum = 0;
forEach(numbers, function(number) {
  sum += number;
});
console.log(sum);
// → 15

我认为您没有掌握调用的语法结构。一个人同样可以写

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

那么,现在这种奇怪的语法是什么呢?首先,它将函数声明替换为函数表达式。函数表达式只是计算为函数对象的表达式,就像数组文字[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;
});