由於想彌補一下本身對一些函數式編程的瞭解和體會,因此特地找了一些資料來閱讀~如下的感想是來自於這本書噠:git
《JS 函數式編程指南》
做者: Franklin Risby for his great work!
地址: https://legacy.gitbook.com/bo...
純函數就是保證輸入和對應的輸出是相同的函數,也就相似於咱們課本中學的函數的概念!一個x永遠只對應一個y值。程序員
好比,js中存在的會改變原數組的一些數組操做函數,這些就是不純的。
主要是有共享的變量和成員,好比全局變量之類的。web
對於可緩存性,有下面這段「通用」的代碼,提取一次(即計算)就緩存一次,後面取的時候就不用從新計算了:編程
var memoize = function(f) { var cache = {}; return function() { var arg_str = JSON.stringify(arguments); cache[arg_str] = cache[arg_str] || f.apply(f, arguments); return cache[arg_str]; }; };
而若是函數是不純的話,咱們並不能靠輸入的值來提取出惟一對應的結果,由於它可能有多種狀況。數組
可移植性緩存
可移植性能夠意味着把函數序列化(serializing)並經過 socket 發送。也能夠意味着代碼可以在 web workers
中運行。總之,可移植性是一個很是強大的特性。
自文檔化是說把須要的數據都寫在參數裏,不寫成好比對象的形式,由於對象的屬性能夠在外面被修改因此可能會形成不同的結果。
而把參數都列出來,這樣使用者也知道它須要什麼數據,也就是像有文檔同樣告訴你。app
可測試性
咱們不少狀況下都是要測試某一個函數或者某一個部分,若是這個函數依賴一些全局的東西,咱們在設置斷點的時候涵蓋的範圍就會很大,因此這樣會影響咱們的測試。而純函數可讓咱們只專一於這一個函數。socket
斷言:表示爲一些布爾表達式,程序員相信在程序中的某個特定點該表達式值爲真,能夠在任什麼時候候啓用和禁用斷言驗證,所以能夠在測試時啓用斷言而在部署時禁用斷言。一樣,程序投入運行後,最終用戶在遇到問題時能夠從新啓用斷言。
合理性ide
若是一段代碼能夠替換成它執行所得的結果,並且是在不改變整個程序行爲的前提下替換的,那麼咱們就說這段代碼是引用透明的。
咱們可使用一種叫作「等式推導」(equational
reasoning)的技術來分析代碼。所謂「等式推導」就是「一對一」替換,有點像在不考慮程序性執行的怪異行爲(quirks of
programmatic evaluation)的狀況下,手動執行相關代碼。
最後一個並行代碼,就是說能夠並行運行任意純函數。因他們不須要訪問共享的內存,也不會因反作用而進入競爭狀態。函數式編程