Logo
Section 1 / 2

一等公民

高阶函数(HOF)让你能够将函数当作数据来使用,从而实现函数式编程中最强大的模式。(5分钟阅读)

导入

一等公民

高阶函数(HOF)让你能够将函数当作数据来使用,从而实现函数式编程中最强大的模式。(5分钟阅读)

函数作用于数据,对吧?



字符串是数据

1const result = sayHi('User'); // 'Hi, User!' 2 3console.log({ result });

数字是数据

1const result = double(4); // 8 2 3console.log({ result });

布尔值是数据

1const result1 = getClearance(true); // 'Access granted' 2const result2 = getClearance(false); // 'Access denied' 3 4console.log({ result1, result2 });

对象是数据

1const result = getFirstName({ 2 firstName: 'Bobo' 3}); // 'Bobo' 4 5console.log({ result });

数组是数据

1const result = len([1, 2, 3]); // 3 2 3console.log({ result });

这五种类型在主流编程语言中都被视为一等公民。

它们为什么是一等公民?因为你可以随意传递它们、将它们存储在变量和数组中、用作计算的输入。你可以像对待任何其他数据一样使用它们。

函数也可以是数据

JavaScript 借鉴了函数式编程的思想,增加了一个新的“一等公民”:函数。

1const isEven = (num) => num % 2 === 0; 2 3const result = [1, 2, 3, 4].filter(isEven); 4 5console.log({ result });

看看 filter 如何使用 isEven 来决定保留哪些数字?isEven 是一个函数,作为参数传给了另一个函数。

你还可以返回一个函数。

1const addNumbers = (x) => (y) => x + y;

addNumbers 需要两个参数,但不需要一次性全部提供。你可以立即传入两个值:

1const addNumbers = (x) => (y) => x + y; 2 3const result = addNumbers(10)(20); 4 5console.log({ result });

也可以分步传入:

1const addNumbers = (x) => (y) => x + y; 2 3const add10 = addNumbers(10); 4const result = add10(20); 5 6console.log({ result });

能够接收或返回其他函数的函数被称为高阶函数。它之所以被称为“高阶”,是因为它不仅作用于字符串、数字、数组等数据,还作用于函数本身——非常具有抽象性。

这一切之所以可能,正是因为 JavaScript 将函数与其他类型(如字符串、布尔值、对象、数组)一样,视为一等公民。

有了函数,你可以:

  • 将其存储为变量
  • 将其放入数组中
  • 作为对象属性(方法)赋值
  • 作为参数传递
  • 从其他函数中返回

就像处理任何其他数据一样。这才是关键所在。

总结

  • 字符串、数字、布尔值、数组和对象可以被存储为变量、数组元素或对象属性/方法。

  • JavaScript 对函数也采取同样的处理方式。

  • 这使得我们可以编写操作其他函数的函数——即高阶函数。

纯函数

为什么它们很友好