Functional Programming(函數式編程)在概念上和Object Oriented Programming(面向對象編程), Procedural Programming(過程化編程)相似, 是一種編程範式。
與OOP以對象爲中心的理念不一樣,FP將全部計算機的操做視爲函數運算,函數是操做的基本單位。函數擁有和基本類型同樣的地位,能夠將一個變量賦值爲函數(First class -- 一等公民)
,能夠在函數的參數中傳遞函數(higher-order function -- 高階函數)
。javascript
反作用(side effects)
的,不須要考慮死鎖問題,適合併發編程,所以在雲計算領域獲得了普遍應用(Scala)
好了,進入正題
如下示例代碼均爲JavaScriptjava
先來看兩段代碼程序員
//代碼片斷1 let minium = 20; const checkAge = (age)=> age >= minium;
//代碼片斷2 let number = 2; const multipleNumber = (n) => { number = number * n; return number; }
這兩段代碼有問題嗎?
一般狀況下,代碼片斷1並不會發生什麼問題, 咱們傳入年齡,而且判斷是否是大於20歲。編程
但若是有人修改了minium
呢?此時判斷的條件改變了,致使咱們的結果也會改變。當咱們第二次運行checkAge(22)
的時候,可能返回的並非第一次運行的結果。api
對於checkAge
這個函數來講,它須要觀測的值不只有入參age
,還有一個全局變量minium
,它的運行結果依賴系統狀態,這對於程序員來講是十分痛苦的。併發
而代碼片斷2就很容易發現問題了,這個函數修改了一個全局變量,換言之,它修改了系統狀態,當第二次輸入相同參數的時候你會獲得一個不同的結果。ide
不,這太讓人難過了,這不是咱們想要的,咱們但願咱們的函數足夠純淨,相同的輸入永遠獲得相同的輸出。並且,不要作多餘的事:
偷偷在console裏打一個log
偷偷給某個api發送一個request
偷偷修改本地文件系統函數式編程