在學習 js 的過程中時常會聽到乙個名次——「函式式程式設計」,那麼究竟什麼是函式式程式設計,函式式程式設計又有什麼優點,這就在這篇部落格進行乙個簡單的總結吧~主要內容:
首先,我們放下程式設計的概念,我們來看函式。
函式的概念來自於數學,數學中的函式f(x) = y
有乙個非常重要的特點對於乙個給定的 x,有唯一的 y 與其對應(這就是為什麼橢圓曲線不是函式)
然而在程式設計中,函式並不具有這個特點,舉個栗子:
let val =
1function
add(x)
console.
log(
add(1)
)// 2
val +=
1console.
log(
add(1)
)// 3
可以看到程式設計中的函式在引數相同的情況下,允許有不同的返回值——只要依賴於函式外部的量
那麼當函式依賴於外部的變數(常量不會有這樣的問題),並且函式在多處呼叫,就有可能出現 bug,函式的呼叫結果可能會和預期結果相去甚遠
而函式式程式設計就要求我們規避這樣的情況,讓所有函式對於相同的輸入的返回值相同,這樣的特性就叫做引用透明性,這就是函式式程式設計的核心特性!
乙個符合引用透明性的函式的栗子:
function
id(x)
在上文中提到過,程式語言中的函式大多是不滿足數學中的函式的概念的,so 我們將滿足數學函式條件的函式稱為「純函式」
函式式程式設計的優點大多都來自於純函式除了測試人員進行的全方位測試外,我們在開發過程中往往要對自己寫的**進行模組測試
在開發中,我受非純函式**已久,由於它依賴了外部變數(比如儲存在 localstorage 中的資料)我不得不三番五次去檢查這些外部變數是否在某個過程中被改變甚至是刪除
let val =
1function
add(x)
console.
log(
add(1)
)// 2
// 在未知因素影響下 val被改變
console.
log(
add(1)
)// 預期結果 2,實際輸出 emmmmm
如果我沒有注意外部依賴而是一頭紮進函式邏輯裡,可能永遠都找不到這個bug
雖然我們都知道 js 是一門單執行緒語言(關於js的執行可以參見->技術總結——js的執行順序),但是我們為了提高前端的效能可能會通過webworker
來併發執行多個任務,或者在 node 環境下 js 併發執行函式
這個時候就是對非純函式的乙個很大的考驗:
let global =
"全域性變數"
letfunc1=(
)=>
letfunc2=(
)=>
}
上面的兩個函式都依賴於外部的global,當它們併發執行,func1就會對func2產生影響,如果將它們變為純函式就不會有這樣的問題:
let global =
"全域性變數"
letfunc1
=(x)
=>
letfunc2
=(x)
=>
}
當我們的函式都是純函式,而我們又會多次呼叫函式,我們就可以對函式物件進行乙個快取
比如我們需要大量計算數字的4次方,我們可以建立乙個對映表用來快取函式的執行結果:
// 對映表
let fourtimestable =
;let fourtimes =
(x)// 檢查表中是否有 2 的四次方,如果有就返回,如果沒有就執行函式避免運算
fourtimestable.
hasownproperty(2
)?fourtimestable[2]
: fourtimestable[2]
=fourtimes(2
)
管道過濾器是一種很經典的設計模式,我們可以將這種模式和函式式程式設計結合起來
在管道和過濾器軟體體系結構中,每個模組都有一組輸入和一組輸出。每個模組從它的輸入端接收輸入資料流,在其內部經過處理後,按照標準的順序,將結果資料流送到輸出端,以達到傳遞一組完整的計算結果例項的目的。
在這種結構中,各模組之間的聯結器充當了資料流的導管,將乙個過濾器的輸出傳到下乙個過濾器的輸入端。所以,這種聯結器稱為「管道」。
我們也可以將這樣的私用運用在函式式程式設計中,將乙個個函式作為過濾器,通過函式的組合,形成一條資料處理的通路:
// 引數累加
function
add(
...args)
)return result
}// 引數累乘
function
times
(...args)
)return result
}let arr1=[1
,3,6
],arr2=[2
,5,21
],arr3=[3
,7,8
,27,4
]// 三組資料,要求組內累乘,然後結果累加
add(
times
(...arr1)
,times
(...arr2)
,times
(...arr3)
)// 三組資料,要求組內累加,然後結果累乘
times
(add
(...arr1)
,add
(...arr2)
,add
(...arr3)
)
對函式式程式設計的初探暫止於此,進一步學習後再做總結~ 函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
跨過程式設計門檻之初見Erlang互動式環境
互動環境是開始學習erlang語言的最好工具,在其中你可以執行erlang的表示式 編譯erlang的程式原始檔 執行已編譯的erlang的程式,還可以進行程式的除錯。erlang的互動式執行環境可以作為乙個運算器,比如 符合數學四則運算規則的式子都可以在其中計算出結果,甚至你感覺很大的整數運算,一...
函式式程式設計
最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...