高階函式 (Higher Order Function) 是什麼?

2023年2月15日

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

高階函式 (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 上追蹤我們