Pure Function,直譯一下就是「純函數(shù)」迈窟。
Pure Function 的概念很簡(jiǎn)單,也許你看到這個(gè)名詞就已經(jīng)明白這篇文章的主旨了 -- 但我還是需要通俗地解釋?zhuān)破眨┮幌屡γ牛吘惯@只是起點(diǎn)而已斗蒋。
1. 在給定同樣的參數(shù)的前提下汉矿,Pure Function 都會(huì)返回同樣的結(jié)果受裹。
例如:
function incresae(n) {
return n + 1;
}
increase 函數(shù)的返回值總是在入?yún)?n 的基礎(chǔ)上增加 1西傀。
這看起來(lái)十分合乎邏輯事扭,但我們的程序肯定沒(méi)有那么簡(jiǎn)單捎稚,現(xiàn)在我們改寫(xiě)一下 increase 函數(shù):
var number = 1;
function increase(n) {
return n + number;
}
你一定發(fā)現(xiàn)了,increase 函數(shù)現(xiàn)在的返回值是由入?yún)?n 和外部定義的一個(gè)變量「計(jì)算」所得的求橄。
如果我們的程序里有另一個(gè)函數(shù):
function doubleNumber(number) {
return number * 2;
}
我想你一定知道我要表達(dá)的意思了:Fure Function 的返回值今野,只能由其函數(shù)入?yún)⑺鶝Q定,而不能有其他的干擾因素(比如這里的變量 number
)罐农。
**2. Pure Function 在計(jì)算返回值的時(shí)候不會(huì)產(chǎn)生 Side Effect **
所謂 Side Effect 就是我們?cè)谄綍r(shí)經(jīng)常做的一些工作条霜,例如:I/O 操作,修改函數(shù)入?yún)⒒蚝瘮?shù)外部的變量涵亏,拋出異常等宰睡。
就 JavaScript 而言,我們常用的 console.log()
函數(shù) -- 會(huì)輸出內(nèi)容到控制臺(tái)气筋,用來(lái)生成隨機(jī)數(shù)的 Math.random()
-- 會(huì)改變?nèi)值?seed拆内,這實(shí)在是太多太多了。
你可以大概在腦海里列舉一下你所熟悉語(yǔ)言中那些會(huì)產(chǎn)生 Side Effect 的操作宠默。
套用一個(gè)句式:
會(huì)產(chǎn)生 Side Effect 的 Function 不是真正的 Pure Function 麸恍。
可以想象的是,Pure Function 有很多的優(yōu)點(diǎn)搀矫,例如:
每個(gè) Pure Function 的運(yùn)行結(jié)果都是可重現(xiàn)的抹沪。這樣的好處就是 Pure Function 十分容易進(jìn)行測(cè)試 -- 因?yàn)檫@完全是一個(gè)透明的盒子。
?
科普向的文章艾君,寫(xiě)的有點(diǎn)啰嗦了,見(jiàn)諒肄方。
參考內(nèi)容:
Pure Function, Wikipedia
FP: Pure Functions, Sitepoint
Side Effect, Wikipedia