高阶函式 (Higher Order Function) 是什么?
2023年2月15日
💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源
高阶函式 (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 等。
而高阶函式指的是该函式本身能不能接收函式当作参数,或是回传函式作为回传值。