理解高阶函数

2025-06-09

理解高阶函数

高阶函数是一个非常基本的概念(也非常重要),但也有点被误解。

让我们首先了解这个概念,最清晰的定义,简单直接,你可能在一些技术面试中用到它。

什么是高阶函数?(又称 HOF)

高阶函数是所有接受其他函数作为参数和/或返回一个函数的函数。

在进行更深入的解释之前,我们可以列出一些有关编程中 HOF 的重要事项。

  1. 使我们的代码更具声明性且易于阅读。
  2. 它是编程中更复杂概念的关键概念,例如闭包、柯里化、承诺等。
  3. 我们可以概括函数,以便在必要时以不同的方式重复使用它们。

理解高阶函数

请参阅下面的代码:

function copyArrayAndMultiplyBy5(array) {
  const output = [];
  for (let i = 0; i < array.length; i++) {
    output.push(array[i] * 5);
  }
  return output;
}
const myArray = [1,2,3];
const result = copyArrayAndMultiplyBy5(myArray);
Enter fullscreen mode Exit fullscreen mode

假设我们现在想做一个 3、4 的乘法函数
,或者加法或除法。我们需要复制粘贴各种函数,只需更改名称,将值从 5 改为 3、4,并将运算符从 * 改为 + 和 /。

并且,如果我们不在声明时刻定义函数的所有行为,那么我们是否可以定义一个参数来接收另一个函数作为参数,并让行为执行?

在 Javascript 中,函数是对象,称为第一类对象。

如果我们可以将对象作为参数传递给一个函数,那么我们也可以传递另一个函数。
让我们编辑一下代码。

function copyArrayAndManipulate(array, fn) {
  const output = [];
  for (let i = 0; i < array.length; i++) {
    output.push(fn(array[i]));
  }
  return output;
}

Enter fullscreen mode Exit fullscreen mode

现在我们创建一个通用函数copyArrayAndManipulate,它接收数组 e 作为参数,即一个名为fn的函数。

我们不知道您声明时函数的所有行为,而且我们也不需要知道。

函数copyArrayAndManipulate是我们的高阶函数,而我们将传入参数的函数fn是我们的回调函数。

现在我们可以以更简单、更动态的方式创建变体,而无需复制和粘贴不必要的代码。

function copyArrayAndManipulate(array, fn) {
  const output = [];
  for (let i = 0; i < array.length; i++) {
    output.push(fn(array[i]));
  }
  return output;
}
function multiplyBy5(input) { 
  return input * 5;
}
function multiplyBy3(input) { 
  return input * 3;
}
function multiplyBy4(input) { 
  return input * 4;
}
const result1 = copyArrayAndManipulate([1, 2, 3], multiplyBy5);
const result2 = copyArrayAndManipulate([1, 2, 3], multiplyBy3);
const result3 = copyArrayAndManipulate([1, 2, 3], multiplyBy4);
Enter fullscreen mode Exit fullscreen mode

我们的代码保持了更强的声明性和易读性,因为在阅读时我们确切地知道 result1 的值将是数组 [1, 2, 3] 的副本乘以 5。

好的,这已经改善了我们的代码编写,避免了不必要的代码,但我们可以使用箭头函数让其更加美观。

function copyArrayAndManipulate(array, fn) {
  const output = [];
  for (let i = 0; i < array.length; i++) {
    output.push(fn(array[i]));
  }
  return output;
}
const multiplyBy5 = (input) => input * 5;
const multiplyBy3 = (input) => input * 3;
const multiplyBy4 = (input) => input * 4;
const result1 = copyArrayAndManipulate([1, 2, 3], multiplyBy5);
const result2 = copyArrayAndManipulate([1, 2, 3], multiplyBy3);
const result3 = copyArrayAndManipulate([1, 2, 3], multiplyBy4);
Enter fullscreen mode Exit fullscreen mode

好多了。但我们不需要把函数存储在常量中,可以直接传递它们。这给了我们更多的动态。

function copyArrayAndManipulate(array, fn) {
  const output = [];
  for (let i = 0; i < array.length; i++) {
    output.push(fn(array[i]));
  }
  return output;
}
const result1 = copyArrayAndManipulate([1, 2],(input) => input * 5);
const result2 = copyArrayAndManipulate([1, 2],(input) => input * 3);
const result3 = copyArrayAndManipulate([1, 2],(input) => input * 4);
Enter fullscreen mode Exit fullscreen mode

细心的人一定注意到了它与map函数的相似之处。
没错,它就是这么工作的。除了 map 函数之外,我们还有其他一些非常常用且广为人知的函数,例如高阶函数 (HOF)(例如filterreduce)。

结论

高阶函数是一个简单而重要的概念,但很多人理解它有点困难。

我希望能够以更好的方式揭开这个谜团。

很快见到你!👋

如果你迷失了:
理解类和原型
理解闭包

鏂囩珷鏉ユ簮锛�https://dev.to/jgamaraalv/understanding-higher-order-function-1dlg
PREV
如何将软件包发布到 GitHub 软件包注册表
NEXT
你笑你就输了 使用 Javascript AI 你笑你就输了 安装配置启动