导入
一等公民
高阶函数(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 对函数也采取同样的处理方式。
-
这使得我们可以编写操作其他函数的函数——即高阶函数。