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