一級函式 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)開發。