const a1 = 10; const aFunc1 = () => { // 依賴外部變量 return a1; }
依賴外部環境的函數在運行時必須知足環境條件,如上,aFunc1在a1建立以前運行,就出錯了。javascript
2.不產生反作用。所謂反作用,是一切與外部交互的做用,好比console.log,IO,網絡請求等。這些操做的結果是不可預計的,因此當包含反作用操做的函數執行後,結果是不可預計的。好比IO讀寫失敗,網絡出現問題,console.log一般沒什麼問題,但這仍然是外部的。舉個片面的例子,在react裏使用,就有可能由於打印某個在將來會被改變的狀態,致使組件沒必要要的被刷新。java
3.函數與外部的合法交互只能經過參數傳遞的方式。react
函數式編程,本質上是數學,它是數學現有理論在編程上的實現,在數學上,一個定理成立一般要知足一些數學條件,函數式編程也須要知足條件,這個條件就是函數必須是純函數。 git
如上圖,能夠用一個函數表達式描述,即y = f(x),這是一種一一對應關係,輸入x能獲得惟一的結果y。也就是說x通過f的轉換變成y,這個過程是穩定的,肯定的,以此類推,y也能夠通過某種肯定的轉換g,變成z,那麼就具備以下等式: 編程
\[y = f(x) = 2x\]網絡
\[z = g(y) = y + 1\]ide
\[z = g(f(x)) = w(x) = 2x + 1\]函數式編程
也就是說x通過w轉換,能夠變成z 函數
某個狀態通過多個函數轉換成另外一個狀態,那麼中間轉換過程能夠結合成一個轉換,這大大的使問題簡化,這是函數式編程帶來的好處,並且只是一部分的好處,而這都基於純函數。 ui
固然,咱們知道,**不少時候沒法避免使用反作用**。就如發送消息,必須通過網絡。那是否函數式編程沒有實際運用價值呢?固然不是。全部事情都不該該極端的理解,函數式編程的種種定理必須以純函數做爲根基,目的是寫出健壯的,聲明式的代碼。能夠利用函數式編程中如curry,functor,monad等奇巧淫記,將反作用加以限制並降到最低限度,保證代碼的大部分是純的。