国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > JS > 正文

JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法分析

2024-05-06 16:51:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法。分享給大家供大家參考,具體如下:

函數(shù)式編程鼓勵(lì)我們多創(chuàng)建純函數(shù)(pure functions),純函數(shù)只依賴你交給它的東西,不使用任何函數(shù)以外的東西,也不會(huì)影響到函數(shù)以外的東西。跟純函數(shù)對(duì)應(yīng)的就是不純函數(shù)(impure functions),也就是不純函數(shù)可能會(huì)使用函數(shù)以外的東西,比如使用了一個(gè)全局變量。也可能會(huì)影響到函數(shù)以外的東西,比如改變了一個(gè)全局變量的值。

多使用純屬函數(shù)是因?yàn)樗煽恳恍矝](méi)什么副作用(side effects)。你交給它同樣的值,它每次都會(huì)給你輸出同樣的結(jié)果,這種特質(zhì)叫所指透明(Referential transparency) 。這會(huì)讓程序更穩(wěn)定,也更容易測(cè)試。

副作用

純函數(shù)沒(méi)副作用,有副作用的函數(shù)都不純。我吃了一片感冒藥,是要治我的感冒,但副作用是它讓我想睡覺(jué)。函數(shù)的副作用多數(shù)表現(xiàn)為函數(shù)依賴或者改變了它以外的東西。

看個(gè)例子:

let name = 'longzhoufeng'const greet = () => { console.log(`hello, ${name}`)}

greet 不是純函數(shù),因?yàn)檫@個(gè)函數(shù)依賴函數(shù)以外的東西,這里就是全局作用域下的 name。這樣做的問(wèn)題是,函數(shù)依賴的 name 很可能在應(yīng)用運(yùn)行的時(shí)候發(fā)生變化,這樣試一下:

greet() // 輸出:“hello, longzhoufeng”let name = 'longzhoupeng' // name 的值被改變了greet() // 輸出:“hello, longzhoupeng”

這樣改一下:

const greet = (name) => { console.log(`hello, ${name}`)}

現(xiàn)在函數(shù)明確的說(shuō)明了自己需要的東西,這里就是 name 參數(shù)。它現(xiàn)在只依賴你交給它的 name 參數(shù)的值。但是這個(gè)函數(shù)仍然不是純函數(shù),因?yàn)樗诳刂婆_(tái)上輸出了東西,這其實(shí)改變了函數(shù)之外的東西,所以它不是純函數(shù)。這樣再改一下:

const greet = (name) => { return `hello, ${name}`}

現(xiàn)在 greet 就會(huì)是一個(gè)純函數(shù),因?yàn)樗灰蕾嚱唤o它的 name ,也沒(méi)有改變函數(shù)以外的東西。而且你每次給它同樣的 name 值,它每次都會(huì)給我們返回同樣的結(jié)果。這種函數(shù)用起來(lái)即安全又可靠。

所指透明

所指透明(Referential transparency)。比如我說(shuō):“中國(guó)的首都”。我的表達(dá)所指的意思就是 “北京”,沒(méi)什么其它的隱含的意思。所以可以說(shuō)我的表達(dá)所指是透明的(Referentially transparent)。再比如:“我有點(diǎn)餓”。這個(gè)表達(dá)所指就不透明,我表達(dá)的到底是什么意思是不能確定的,我可能是想出去吃點(diǎn)東西,也可能是想讓你幫我買點(diǎn)東西回來(lái)吃。

純函數(shù)所指的東西都是透明的,因?yàn)槟憬o它同樣的東西,它每次都會(huì)返回一樣的結(jié)果。

const greet = (name) => { return `hello, ${name}`}const logger = (message) => { console.log(message)}logger(greet('longzhoufeng'))// 上面的表達(dá)式也可以這樣:logger('hello, longzhoufeng')// 得到的結(jié)果是一樣的,因?yàn)?greet 所指透明。// 給它一個(gè) “longzhoufeng”,它所指的東西就是 “hello, longzhoufeng”

因?yàn)?greet 所指透明,所以如果我們?cè)诒磉_(dá)式中把它替換成它所指的東西,不會(huì)影響到程序的運(yùn)行。比如在一個(gè)表達(dá)式里所有使用 greet('longzhoufeng') 的地方,我們都可以把 greet('longzhoufeng') 替換成 hello, longzhoufeng,這是因?yàn)?greet('longzhoufeng') 所指的東西就是字符串 hello, longzhoufeng 。

參考資料

http://stackoverflow.com/questions/210835/what-is-referential-transparency

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安国市| 黔东| 唐海县| 航空| 垫江县| 建宁县| 西和县| 正镶白旗| 祁阳县| 巨野县| 华蓥市| 吉木乃县| 古蔺县| 西乌珠穆沁旗| 贵溪市| 瑞金市| 长武县| 铅山县| 阿克陶县| 嘉禾县| 井陉县| 赫章县| 吴桥县| 桃园市| 大名县| 乌鲁木齐县| 海盐县| 阳西县| 陆河县| 岳阳县| 璧山县| 青岛市| 峨边| 蓬安县| 宜川县| 浠水县| 鹤庆县| 阿图什市| 合肥市| 乐陵市| 蓝田县|