一級函式和高階函式
一級函式 First-class Function
一級函式的意思是,函式和其他人一樣,都是一級公民,我們可以把函式存在陣列中,當作參數傳遞,賦予至變數等等。
這並非是 JavaScript 專有的特性,只要該語言把「函式視為變數值看待」,就是有一級函式的特性。
高階函式 higher order function
我們可以說 JS 因為有一級函式特性,所以可以有高階函式的用法。
所謂高階函式,就是能接收函式做為參數,或回傳函式的函式
如果有在用 ES6 語法,其實我們常常在用高階函式,
像是 ES6 中對陣列操作的方法 map、filter 就是高階函式,它們都是接收函式為參數
let ary = [1, 2, 3];
let newAry = ary.map(function (i) {
return i * 2;
});
let newAry2 = ary.filter(function (i) {
return i === 2;
});
console.log(newAry1); //[2, 4, 6]
console.log(newAry1); //[2]
是不是有點概念了,接下來我們就來實作一個類 map 方法,加深印象。
這個方法要做的事項有
- 創造一個 function,接受函式和陣列
- 創建變數(空陣列),用於存放結果
- 對傳入的陣列執行迴圈
- 逐個取得陣列元素,並取得函式修改後的回傳值
- 回傳值逐個放入結果變數裡
- 迴圈執行完畢後,回傳結果
function map(fn, array) {
let result = [];
for (let i = 0; i < array.length; i++) {
result.push(fn(array[i]));
}
return result;
}如此一來我們的類 map 方法就完成了,執行看看
let newMap = map(
function(i){
return i * 2
},
ary
)
console.log(newMap) //[2, 4, 6]運行結果和我們預期的一樣,很好
總結
JS 中函式是一級公民的特性,讓我們可以靈活的對函式做不同組合,使用出高階函式,
也相當適合用函數式編程(functional programming)開發。
