純函數是全部函數式編程語言中使用的概念,這是一個很是重要的概念,由於它是函數式編程的基礎,它容許你建立簡單和複雜的組合模式。javascript
純函數背後的數學術語我就不說了,我直接說說說它們是什麼以及它們的樣子。java
你能夠肯定知足如下條件的函數是純函數:git
以如下功能爲例編程
Math.cos(0) // 1
複製代碼
不管今天,明天仍是未來某個時間調用 Math.cos(0)
都不要緊,輸出始終爲1
。咱們來看一個新的例子
app
const numberOfApples = 5;
const applesBought = 5;
const add = (num1, num2) => num1 + num2;
const totalApples = add(numberOfApples, applesBought) // 10
const totalApples = add(numberOfApples, applesBought) // 10
// ... one month later
const totalApples = add(numberOfApples, applesBought) //10
複製代碼
add函數也會發生一樣的事情,無論調用該函數多少次或什麼時候調用該函數,每次輸出都相同。dom
如今,咱們來看一個隨時間或每次調用而變化的函數:編程語言
Math.random() // 返回一個隨機數
Math.random() // 返回一個不一樣的隨機數
// 一個月後
Math.random() // 返回一個不一樣的隨機數
複製代碼
如你所見,每次調用 Math.random()
時,輸出都會改變,所以咱們不能說 Math.random()
是純函數。函數式編程
經過使用非純函數,這個標準也很容易理解,因此讓咱們看看非純函數是什麼樣子的:函數
const numberOfApples = 5
const applesBought = 5
const addApplesToTotal = (num1) => numberOfApples + num1;
const totalApples = addApplesToTotal(applesBought); // 10
複製代碼
從上一個示例能夠看到,函數 addApplesToTotal
使用的是上面定義的變量,它不是傳遞 numberOfApples
的值,而是直接訪問外部範圍。所以,addApplesToTotal
不是自包含的。學習
與前面的標準同樣,可使用非純函數很好地演示這個標準。咱們來看一下 👀
let totalApples = 5
const applesBought = 5
const addApplesToTotal = () => {
totalApples += applesBought
};
addApplesToTotal()
複製代碼
你能從前面的不純函數中注意到什麼?它打破了前面的兩個標準!!
totalApples
的值。爲何純函數很重要?
純函數是函數編程中一個基本但功能強大的概念。學習和習慣純函數可使你更輕鬆地測試和調試代碼。它們將容許你學習關於函數式編程的更復雜的知識。
來源:levelup.gitconnected.com,做者:Guillermo Martínez Espina