什么樣的函數是純函數(Pure Functions)
純函數是函數式編程的基礎
-
相同的輸入總是返回相同的輸出:一個函數的返回值只依賴于它的參數值,無論將該函數放在什么環(huán)境或作用域中,對函數內部的運行都沒有什么影響,其返回結果也是可預測的。因此,純函數也更便于遷移
舉個栗子便于理解:
有個現(xiàn)金盲盒機,抽一次需要¥50。二狗花了¥50抽了一個盲盒,發(fā)現(xiàn)只抽到了¥10。(心塞塞)
const cost = 50;
const getSurprise = cost => 10;
console.log(getSurprise(cost)); // 10
二狗不甘心,又拿出了¥50抽了一個,結果還是¥10。。。后來才知道,這個現(xiàn)金盲盒機的背后是一個無良商家,每個盲盒里都只放了¥10。
過了一段時間,二狗又遇到了一個現(xiàn)金盲盒機,他看見前面的大狗開心地狗言狗語道:“賺啦賺啦~”,心想這次應該不會遇到無良商家了吧,于是打算再試一次。
const cost = 50;
const getSurprise = cost => Math.floor((Math.random()*100)+1);
console.log(getSurprise(cost)); // 76
結果,他抽到了¥76,很開心,接著又抽了一個
console.log(getSurprise(cost)); // 51
又抽了一個
console.log(getSurprise(cost)); // 2
又抽了一個
console.log(getSurprise(cost)); // 43
......
最后,他沒錢了...
從上個栗子可以發(fā)現(xiàn),當函數中進行類似Math.random()這樣的操作時,導致返回值是不固定的,這樣的函數就不是純函數
- 不依賴于外部的狀態(tài):當函數依賴于外部的變量時,該函數的返回值就是不可預測的,會因受到外部變量的影響而改變。純函數不能依賴于函數以外的任何狀態(tài)。
// 我是栗子
var x = 10;
const foo = number => number + x;
console.log(foo(20)); // 30
x = 20;
console.log(foo(20)); // 40
函數foo依賴于外部的x,當x發(fā)生改變時,輸入同樣的參數20,其返回結果不同。這樣的函數也不是純函數
改裝一下:
const foo = number => {
var x = 10;
return number + x;
}
console.log(foo(20)); // 30
console.log(foo(20)); // 30
- 不會產生任何副作用:純函數不會對外部產生任何影響,不會改變任何外部狀態(tài),如改變全局變量、參數等。
const apple = {
color: 'green'
};
// 我不純
const bar = param => {
param.color = 'red';
};
bar(apple);
console.log(apple.color); // red
優(yōu)點
- 簡單、易于調試
- 便于遷移,更靈活
- 便于重構和重組
- 易于并行
以上,筆芯