什麼是純函數,JavaScript函數式編程的基礎

純函數是全部函數式編程語言中使用的概念,這是一個很是重要的概念,由於它是函數式編程的基礎,它容許你建立簡單和複雜的組合模式。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

相關文章
相關標籤/搜索