本系列文章,內容以探討 Kyle Simpson. Functional-Light JavaScript 一書內容為主
- 目標:是讀懂 FP,能用 code 與人交流,而不是被壓在 FP 的術語大山下喘不過氣。
- 原文地址:Functional-Light JavaScript
FP 不是僅僅用 function
這個關鍵字來編寫。如果這麼簡單,大家就可以洗洗睡開心迎新年了,無論如何, function
是 FP 的核心,function
的概念並不只針對 FP ,對學習非 FP 也是很重要的知識,旅行的第一步就從打好 function
基礎開始吧。
論及 FP ,不免俗的還是要簡單回顧一下,畢竟這個 FP 的概念是從數學演進過來的。
在學習程式以前,我所知道的 function
長得是這樣 f(x)
,還有方程式 (equation) 長這樣 y = f(x)
舉例,一個 equation 定義 f(x) = 2x^2 + 3 ,
y
,兩個值可以組合成一個座標,(2, 11)、(-1, 5)、(3, 21)...
可以做圖如下:在數學中,方程式會有 input(s)
,且總會有 output
;如同在程式裡,也會定義各種 input
和 output
,而在 FP 中,描述這種映射關係的專有名詞是 morphism
。
所以,為什麼討論數學?因為 FP 就是使用 equation 的數學意義作為
function
在學習 FP 以前,procedure
和 function
的區別可能沒那明顯,現在我們可以定義 procedure
(程序) 如下
更進一步定義 function
(函數) 如下
function
接收 input,並一定有明確的 return
接下來的學習都會盡量使用 function
(函數) 而不是 procedure
(程序) ,並有明確的 input
與 return
承上定義,所有 function
都需要 input
,
參數在英文有 arguments、parameters 以下解釋差異:
在 js 中,傳入的 arguments 個數不一定要與 parameters 相等,
arguments
存取 ^1
undefined
function 會有預期接受的參數,而表示參數個數的名詞為 arity
,以上方 function binary (x, y)
為例,arity
為 2。
parameters 的數量,可使用 function
的唯獨屬性 length
,以上方 function binary (x, y)
來說 function.length = 2
。
arguments 的數量,也就是實際傳入的參數數量,可已透過 arguments
物件的 length
取得。
在未來版本替代 arguments.length
之前,使用 arguments.length
是 OK 的,也僅使用 arguments.length
,別使用 arguments[index]
去訪問值,為什麼?
結果為
原因是因為,function 中 parameters 位置會對應 arguments,而這兩者的值都會參考到同一地方,所以對 line 6 favoriteColor = "green"
,其實也連動改到 arguments[0]
的值,以下類推,相關討論請參考 ^2
還記得 Day 3 討論過的 Imperative v.s. Declarative
嗎? 試著觀察下方兩段處理 Input [1,2,3]
的方式,
Imperative code,如上方 iStyle
,專注在如何得掉這個結果,我們如果知道這段的結果,就需要一行一行讀過程式,不是那麼顯而易見。
Declarative code,如 dStyle
,專注在描述結果,也就是我們希望 Input 的樣子,
把握一個原則,也是這一系列文章的精神,盡可能使用 declarative
風格,能自我解釋的 code。
回顧一下上方提到一個術語 arity
,在 FP 中我們希望 function
的 arity
為 1,使用 object destructuring
或是 ES6 的 rest ^3 ,即可傳入多個參數,並且保持 arity
為 1,方便進行 compose
,這部分在接下來的文章會討論。
[^1]: Arguments 物件
[^2]: JavaScript: Don’t Reassign Your Function Arguments
[^3]: Rest parameter