高階函式 (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 等。
而高階函式指的是該函式本身能不能接收函式當作參數,或是回傳函式作為回傳值。