純函數學習 (一)什麼是純函數

純函數學習 (一)什麼是純函數

1.前言:

純函數的定義是這樣的:

純函數是這樣一種函數,即相同的輸入,永遠會得到相同的輸出,而且沒有任何可觀察的副作用。

所以我們可以看出純函數的定義:

  • 相同輸入必定能得出相同輸出。
  • 函數執行過程中沒有任何副作用。

下面讓我們來圍繞這兩點來學習純函數。

2.辨認純函數

純函數和非純函數的辨認是很難的,寫的時候我們就會會出現疑惑導致出現錯誤,這裏我將舉個例子來說明它們間的區別

/**
 * 下面例子是個正例(Positive ),
 * 我們可以看出slice函數輸入相同的情況下輸出必定相同,
 * 而且並不會對array造成影響(內部元素並不會變化)並且也不會對其他環境造成可預見的影響,
 * 所以我們可以說slice是純函數
 **/
let array = [0,1,2,3,4];

array.slice(0,3);//[0,1,2]
array.slice(0,3);//[0,1,2]
console.log(array);//[0,1,2,3,4]

/**
 *	下面例子是個反例(negative),
 *	可以看見縱使輸入相同輸出是不定的,
 *	並且函數修改了原始數組(副作用),
 *	這是個完美的非純函數
 **/
let array2 = [0,1,2,3,4];
array.splice(0,3);//[0,1,2]
array.splice(0,3);//[3,4]
console.log(array);//[]

從上面的例子就能很容易看出所謂副作用就是:

在計算結果的過程中,系統狀態的一種變化,或者與外部世界進行的可觀察的交互

副作用可能包含,但不限於:

  • 更改文件系統
  • 往數據庫插入記錄
  • 發送一個 http 請求
  • 可變數據
  • 打印/log
  • 獲取用戶輸入
  • DOM 查詢
  • 訪問系統狀態

副作用讓一個函數變得不純是有道理的:從定義上來說,純函數必須要能夠根據相同的輸入返回相同的輸出;如果函數需要跟外部事物打交道,那麼就無法保證這一點了。

3.結語

以上就是純函數的定義闡述,從這裏的初步瞭解我們可以看出純函數是個非常特殊的“工具”,自帶“不動”和“避世”屬性,這就讓純函數有很多獨特的特性,明天我將帶大家學習爲什麼要使用純函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章