高阶函式 (Higher Order Function) 是什么?

2023年2月15日

💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

高阶函式 (Higher order function) 是什么?

高阶函式 (Higher order function) 是指当一个函式可以接受另一个函式作为参数、或者返回一个函式作为结果的函式。

这是一种函式语言程序设计 (functional programming) 的概念,不只 JavaScript,许多程式语言都有支援高阶函式,例如:Python、Swift 等。

它的重要性在于,可以帮助提高代码的模块化和可维护性,因此很常应用到不同情境中,底下是一些例子:

  1. 回调函式 (callback function) 包装:可以将回调函式作为参数传递给另一个函式,以实现自定义的行为。
  2. 抽象操作:可以将高阶函式作为封装操作的一层抽象,例如实现过滤、转换等。
  3. 函式组合:可以使用高阶函式组合多个函式,以创建新的函式。

高阶函式 (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 等。

而高阶函式指的是该函式本身能不能接收函式当作参数,或是回传函式作为回传值。

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們