5.1 基本概念
高階函數是函數式編程中的重要方面,在 JavaScript 中被廣泛使用。 它們允許編寫更抽象、緊湊和可重用的代碼。
什麼是高階函數?
高階函數 (higher-order functions) 是指接受其他函數作為參數或返回函數作為結果的函數。它們允許將函數作為第一級物件使用, 這讓你可以創建更抽象和模組化的程序。
高階函數的示例
- 將函數作為參數傳遞。
- 從其他函數返回函數。
5.2 將函數作為參數傳遞
使用內建的數組方法
JavaScript 提供了許多內建的數組方法,這些方法是高階函數,比如 forEach()、map()、filter()、reduce() 等。
1. 方法 forEach()
方法 forEach() 為數組中的每個元素執行指定的函數一次。
JavaScript
const numbers = [1, 2, 3, 4, 5];
numbers.forEach(function(number) {
console.log(number);
});
// 輸出: 1 2 3 4 5
2. 方法 map()
方法 map() 創建一個新數組,其內容是函數在每個數組元素上調用的結果。
JavaScript
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = numbers.map(function(number) {
return number * number;
});
console.log(squaredNumbers);
// 輸出: [1, 4, 9, 16, 25]
3. 方法 filter()
方法 filter() 創建一個新數組,包含通過指定函數測試的所有元素。
JavaScript
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(function(number) {
return number % 2 === 0;
});
console.log(evenNumbers);
// 輸出: [2, 4]
4. 方法 reduce()
方法 reduce() 對累加器和數組中的每個元素(從左到右)應用一個函數,使其縮減為一個值。
JavaScript
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce(function(total, number) {
return total + number;
}, 0);
console.log(sum);
// 輸出: 15
5.3 從其他函數返回函數
高階函數可以返回其他函數,從而創造出更靈活可配置的函數。
1. 拆分 (Currying)
拆分 是將一個接受多個參數的函數轉換為一個接受單個參數的函數,並返回接收下一個參數的新函數,以此類推的過程。
拆分示例:
JavaScript
function multiply(a) {
return function(b) {
return a * b;
};
}
const multiplyByTwo = multiply(2);
console.log(multiplyByTwo(5)); // 輸出: 10
const multiplyByThree = multiply(3);
console.log(multiplyByThree(5)); // 輸出: 15
2. 創建可配置函數
高階函數允許創建可以使用參數進行配置的函數。
示例:
JavaScript
function createGreeting(greeting) {
return function(name) {
console.log(`${greeting}, ${name}!`);
};
}
const sayHello = createGreeting('Hello');
sayHello('Alice'); // 輸出: Hello, Alice!
const sayHi = createGreeting('Hi');
sayHi('Bob'); // 輸出: Hi, Bob!
5.4 實際應用
讓我們來看看高階函數的實際應用。
函數 compose()
函數 compose() 允許將幾個函數組合成一個,依次應用它們:
JavaScript
function compose(...functions) {
return function(initialValue) {
return functions.reduceRight((value, func) => func(value), initialValue);
};
}
const addOne = x => x + 1;
const double = x => x * 2;
const addOneAndDouble = compose(double, addOne);
console.log(addOneAndDouble(5)); // 輸出: 12 (先加1到5,然後雙倍結果)
非同步高階函數
非同步高階函數允許處理非同步操作,例如 API 請求或計時器操作:
JavaScript
function fetchData(callback) {
setTimeout(() => {
callback('Data received');
}, 1000);
}
function processData(data) {
console.log(data);
}
fetchData(processData);
// 輸出: Data received (1秒後)
GO TO FULL VERSION