接觸前端之前,由於後端Ruby on Rails是很物件導向的語言,對於什麼是Functional Programming一頭霧水。一剛開始看到大家這樣寫快吐血了,後來慢慢的也習慣了Functional Programming的寫法,自己也寫了一段code。
First-class-citizens
首先Functional Programming要先知道什麼是First-class-citizens。First-class-citizens 的意思是我們可以將function視為參數一樣指派到一個變數裡面。以下圖為例,下圖左的 fn就是sayHello function,而下圖右由於呼叫了sayHello function(加了括號在後面就可以呼叫)就會印出”Hello World”。
以下圖為例:
這種anonymous function的形式跟上圖左概念有 87%像,雖然不直覺但,潮!很多人這樣寫。message呼叫fn,fn calls sayHello function by reference, sayHello function call anonymous function by reference…。這種把function 傳來傳去的方式在react非常普遍,剛開始看頭真的很痛,尤其是又不在同一支檔案的時候,但習慣就好,用著用著自己也會覺得好像還蠻帥的。
Higher Order Function
拿被指派為 function的參數拿來做操作,或者return function,都是Higher Order Function。
最經典的例子就是 setTimeout或者 array.prototype.map, array.prototype.forEach等用法。下面的例子是在裡面放了anonymous function。
以下面的程式碼為例,ask就是一個higher ordered function,當按yes去呼叫showOK, 按no呼叫showCanceled。我們在Javascript很常使用這種callback技巧,可以放callback function的就是higher ordered function。
Pure Function
Pure Function有一個最重要的特性,那就是輸入了相同的值,吐出的值都是相等的結果。
Mosh整理出Functional Programming的三個特性。首先如果function裡面有處理時間、亂數等,同樣的值進去不會有相同的結果就不純,以及如果對DOM, files等全域值做操作,所以不能保證每一次進去function的結果會相等。
雷恩跟小當家對戰的延長賽,雷恩拿出了最後一把菜刀做出了烈兵仙鯛山,抓準時機把握鯛魚捕上來6個小時的時間,小當家在上菜的時候已經錯過了最新鮮的時候。看似雷恩贏了,不料小當家除了將鋼絲菜刀跟百穴菜刀合體外,還將菜刀加熱,利用熱將鯛魚的新鮮記憶起來。Function就是那把加熱後的菜刀,當小當家揮一次刀,就等於Function被呼叫了一次,但…taste 跟時間有關係,可見小當家這一點都不Pure,有了嘟嘟還三心二意。
const taste = function 菜刀(魚) {
return 魚當時時間的味道
}碗.push(taste)
然而為什麼一定要純,其實基本上我們在寫code不用那麼純,但作為reducer用,reducer必須是Pure Function來防止side Effect。