純函數

什么樣的函數是純函數(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)點

  • 簡單、易于調試
  • 便于遷移,更靈活
  • 便于重構和重組
  • 易于并行

以上,筆芯

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容