本文實(shí)例講述了JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法。分享給大家供大家參考,具體如下:
創(chuàng)新互聯(lián)建站服務(wù)項目包括泰來網(wǎng)站建設(shè)、泰來網(wǎng)站制作、泰來網(wǎng)頁制作以及泰來網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,泰來網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到泰來省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
函數(shù)式編程鼓勵我們多創(chuàng)建純函數(shù)(pure functions),純函數(shù)只依賴你交給它的東西,不使用任何函數(shù)以外的東西,也不會影響到函數(shù)以外的東西。跟純函數(shù)對應(yīng)的就是不純函數(shù)(impure functions),也就是不純函數(shù)可能會使用函數(shù)以外的東西,比如使用了一個全局變量。也可能會影響到函數(shù)以外的東西,比如改變了一個全局變量的值。
多使用純屬函數(shù)是因為它更可靠一些,也沒什么副作用(side effects)。你交給它同樣的值,它每次都會給你輸出同樣的結(jié)果,這種特質(zhì)叫所指透明(Referential transparency) 。這會讓程序更穩(wěn)定,也更容易測試。
副作用
純函數(shù)沒副作用,有副作用的函數(shù)都不純。我吃了一片感冒藥,是要治我的感冒,但副作用是它讓我想睡覺。函數(shù)的副作用多數(shù)表現(xiàn)為函數(shù)依賴或者改變了它以外的東西。
看個例子:
let name = 'longzhoufeng' const greet = () => { console.log(`hello, ${name}`) }
greet 不是純函數(shù),因為這個函數(shù)依賴函數(shù)以外的東西,這里就是全局作用域下的 name。這樣做的問題是,函數(shù)依賴的 name 很可能在應(yīng)用運(yùn)行的時候發(fā)生變化,這樣試一下:
greet() // 輸出:“hello, longzhoufeng” let name = 'longzhoupeng' // name 的值被改變了 greet() // 輸出:“hello, longzhoupeng”
這樣改一下:
const greet = (name) => { console.log(`hello, ${name}`) }
現(xiàn)在函數(shù)明確的說明了自己需要的東西,這里就是 name 參數(shù)。它現(xiàn)在只依賴你交給它的 name 參數(shù)的值。但是這個函數(shù)仍然不是純函數(shù),因為它在控制臺上輸出了東西,這其實(shí)改變了函數(shù)之外的東西,所以它不是純函數(shù)。這樣再改一下:
const greet = (name) => { return `hello, ${name}` }
現(xiàn)在 greet 就會是一個純函數(shù),因為它只依賴交給它的 name ,也沒有改變函數(shù)以外的東西。而且你每次給它同樣的 name 值,它每次都會給我們返回同樣的結(jié)果。這種函數(shù)用起來即安全又可靠。
所指透明
所指透明(Referential transparency)。比如我說:“中國的首都”。我的表達(dá)所指的意思就是 “北京”,沒什么其它的隱含的意思。所以可以說我的表達(dá)所指是透明的(Referentially transparent)。再比如:“我有點(diǎn)餓”。這個表達(dá)所指就不透明,我表達(dá)的到底是什么意思是不能確定的,我可能是想出去吃點(diǎn)東西,也可能是想讓你幫我買點(diǎn)東西回來吃。
純函數(shù)所指的東西都是透明的,因為你給它同樣的東西,它每次都會返回一樣的結(jié)果。
const greet = (name) => { return `hello, ${name}` } const logger = (message) => { console.log(message) } logger(greet('longzhoufeng')) // 上面的表達(dá)式也可以這樣: logger('hello, longzhoufeng') // 得到的結(jié)果是一樣的,因為 greet 所指透明。 // 給它一個 “l(fā)ongzhoufeng”,它所指的東西就是 “hello, longzhoufeng”
因為 greet 所指透明,所以如果我們在表達(dá)式中把它替換成它所指的東西,不會影響到程序的運(yùn)行。比如在一個表達(dá)式里所有使用 greet('longzhoufeng') 的地方,我們都可以把 greet('longzhoufeng') 替換成 hello, longzhoufeng,這是因為 greet('longzhoufeng') 所指的東西就是字符串 hello, longzhoufeng 。
參考資料
http://stackoverflow.com/questions/210835/what-is-referential-transparency
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
當(dāng)前標(biāo)題:JavaScript函數(shù)式編程(FunctionalProgramming)純函數(shù)用法分析
分享網(wǎng)址:http://jinyejixie.com/article20/joppco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、品牌網(wǎng)站建設(shè)、網(wǎng)站排名、外貿(mào)建站、App開發(fā)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)