高阶函数 (Higher order function) 是什么?
高阶函数 (Higher order function) 是指当一个函数可以接受另一个函数作为参数、或者返回一个函数作为结果的函数。
这是一种函数语言程序设计 (functional programming) 的概念,不只 JavaScript,许多程序语言都有支持高阶函数,例如:Python、Swift 等。
它的重要性在于,可以帮助提高代码的模块化和可维护性,因此很常应用到不同场景中,底下是一些例子:
- 回调函数 (callback function) 包装:可以将回调函数作为参数传递给另一个函数,以实现自定义的行为。
- 抽象操作:可以将高阶函数作为封装操作的一层抽象,例如实现过滤、转换等。
- 函数组合:可以使用高阶函数组合多个函数,以创建新的函数。
高阶函数 (Higher order function) 实际例子
在 JavaScript 中,我们很常使用到的一些内置方法,其实就是高阶函数。以下举 Array.prototype.filter() 为例,并模拟写出一个新的高阶函数。
我们先来看原生的 Array.prototype.filter() 方法,它可以过滤数组中满足某些条件的元素,并返回一个新的数组。
以下代码为例, evenNumber 函数为一个回调函数,传入 filter 函数中作为参数,最终返回结果。
const numbers = [1, 2, 3, 4, 5];
const evenNumber = (item) => item % 2 === 0;
const newNumebers = numbers.filter(evenNumber);
console.log(newNumebers); // [2, 4]
接着,我们照原生的 Array.prototype.filter(),使用高阶函数写一个简单的 myFilter 方法。
以下代码示例, myFilter 高阶函数会接受一个回调函数作为参数,并最终返回新的 filtered 后的数组。
function myFilter(fn, arr) {
const filteredArray = [];
for (let i = 0; i < arr.length; i++) {
if (fn(arr[i])) {
filteredArray.push(arr[i]);
}
}
return filteredArray;
}
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = myFilter((x) => x % 2 === 0, numbers);
console.log(evenNumbers);
补充:一级函数 (First-class functions) 是什么?
通常讨论到高阶函数时,也会一同带到 一级函数 这个名词。“ 一级函数”和“ 高阶函数”是两个相关但不完全相同的概念。
当函数在该程序语言中可以被视为跟其他的变量一样输入或输出时,我们会称那样的程序语言拥有 一级函数。大多数现代程序语言都支持一级函数,例如 JavaScript,Python,Scala 等。
而高阶函数指的是该函数本身能不能接收函数当作参数,或是返回函数作为返回值。