今天要提到的是讓 JS 很適合用來撰寫 Functional Programming 的兩個特性的名詞解釋:「 一級函式」與「高階函式」,如果你寫 JS 一段時間,一定會聽過他,高階函式與一級函式可能聽起來有點複雜,其實並不會,只是字面上意思比較不好理解而已。這兩個特性,讓 JS 可以把函式在其他函式之間互傳,所以也是為什麼有人說 JS 很適合用來寫 Functional Programming 的原因。
當我們說一個語言具有一級函式的特性時,代表這個語言把函式當作其他物件一樣看待,也因此可以將函式當作參數一樣傳入另外一個函式裡面。在 Functional Programming 裡面,也是因為這個特性,才有辦法做到複合函式 (Function Composition),
而在 JS 內,函式本身也是一個特殊的物件(就是 Function 物件),在一些使用到 callback 概念的程式碼中,你就會看到這個概念是如何被應用的:
function doSomething(fn, data) {
return fn(data);
}
只要是可以接收函式作為參數,或是回傳函式作為輸出的函式,我們就稱為高階函式,例如,JS 裡面很常用的一些對陣列操作的內建API:
也可以被稱為是高階函式,因為他們能夠接收函式作為他們的參數。雖然上述幾個 API 的使用方式乍看之下可能會讓人覺得難以理解,但我們可以試著思考看看他們是怎麼被實作的,其實並沒有那麼複雜,下面就以 Array.map 為例,邊實作、邊思考他的運作方式吧!
由於 Arrray.map 是對陣列元素做巡訪,然後做某些操作之後回傳,所以可能的步驟如下:
自己實際實作 map function 的話看起來會像是這樣:
function arrayMap(fn,array){
let length = array.length
let newArray = []
for(let i=0 ; i<length ; i++){
newArray.push(fn(array[i]))
}
return newArray
}
透過上面的程式碼我們自己就實作了高階函式 arrayMap ,可以看到我們自己做的 arrayMap 會在陣列傳入之後,逐個訪問每個元素並傳入我們自己寫的函式 fn ,這個 fn 會根據我們寫的內容將該值做處理之後回傳,然後會直接透過 Array.push 將結果推入新的函式
arrayMap((item)=>{
return item * 2
},[1,2,3,4])
透過今天對兩個名詞的說明我們知道了一級函式與高階函式這兩個名詞的意義,然後我們也自己試著實作了自己的高階函式: