JavaScript是一種發(fā)展迅速的語(yǔ)言 。這篇文章,我想展示一些有關(guān)如何在JavaScript中應(yīng)用函數(shù)式編程的示例 。
JavaScript中的函數(shù)式編程即使函數(shù)式編程可以極大地改善應(yīng)用程序的代碼,但其原理在開(kāi)始時(shí)可能會(huì)有些挑戰(zhàn) 。由于詳細(xì)解釋所有這些都將花費(fèi)大量時(shí)間,因此我們決定使用兩個(gè)實(shí)際的代碼示例來(lái)介紹這些概念

1.Maybe Monad在第一個(gè)示例中,我們找到一種避免驗(yàn)證變量是否為Null的方法 。假設(shè)在我們的應(yīng)用程序中,我們可以找到具有以下格式的用戶:
const someUser = { name: 'some_name', email: 'some@email.com', settings: {language: 'sp' }};有一個(gè)功能,可以以用戶設(shè)置的語(yǔ)言返回歡迎消息 。const allGreetings = { 'en': '嗨', 'sp': '你好', 'fr': '歡迎你'};const getGreetingForUser = (user) => { //將要執(zhí)行}來(lái)看一個(gè)遵循命令式模型的“ getGreetingForUser”函??數(shù)的實(shí)現(xiàn):const getGreetingForUser = (user) => { if (!user) {return allGreetings.en; } if (user.settings && user.settings.language) {if (allGreetings[user.settings.language]) {return allGreetings[user.settings.language]} else {return allGreetings.en;} } else {return allGreetings.en; }};console.log(getGreetingForUser(someUser));如上面所看到的,必須檢查用戶是否已經(jīng)存在,是否已設(shè)置語(yǔ)言,以及是否已準(zhǔn)備好歡迎消息 。如果出現(xiàn)問(wèn)題,我們將以默認(rèn)語(yǔ)言返回一條消息 。現(xiàn)在,讓我們看一下相同的函數(shù),但是這次我們將在其實(shí)現(xiàn)中使用函數(shù)式編程:
const getGreetingForUser = (user) => {return RamdaFantasy.Maybe(user).map(Ramda.path(['settings', 'language'])).chain(maybeGreeting);};const maybeGreeting = Ramda.curry((greetingsList, userLanguage) => {return RamdaFantasy.Maybe(greetingsList[userLanguage]);})(allGreetings);console.log(getGreetingForUser(someUser).getOrElse(allGreetings.en));為了處理可能為null或未定義的情況,我們將使用Maybe Monad 。這使我們可以在對(duì)象周圍創(chuàng)建包裝器,并為空對(duì)象分配默認(rèn)行為 。
讓我們比較兩種解決方案:
//代替驗(yàn)證用戶是否為空if (!user) {return allGreetings.en;}//我們將用:RamdaFantasy.Maybe(user) //我們將用戶添加到包裝器中//代替: if (user.settings && user.settings.language) {if (allGreetings[user.settings.language]) {//我們將用: <userMaybe>.map(Ramda.path(['settings', 'language'])) //如果存在數(shù)據(jù),映射將會(huì)用它//不是在else中返回默認(rèn)值: return indexURLs['en'];.getOrElse(allGreetings 。EN)// 指定的默認(rèn)值 。2 Either Monad當(dāng)我們知道存在空錯(cuò)誤時(shí)的默認(rèn)行為時(shí),Maybe Monad非常有用 。但是,如果我們有一個(gè)引發(fā)錯(cuò)誤的函數(shù),或者我們將各種引發(fā)錯(cuò)誤的函數(shù)鏈接在一起,并且我們想知道哪個(gè)發(fā)生了故障,則可以改用Either Monad 。

現(xiàn)在,讓我們假設(shè)我們要計(jì)算產(chǎn)品的價(jià)格,同時(shí)考慮增值稅和可能的折扣 。我們已經(jīng)有了以下代碼:
const withTaxes = (tax, price) => {2 if (!_.isNumber(price)) {3 return new Error("Price is not numeric");4 }5 return price + (tax * price);6};7const withDiscount = (dis, price) => { 8if (!_.isNumber(price)) { 9return new Error("Price is not numeric"); 10} 11if (price < 5) 12return new Error("Discounts not available for low-priced items"); 13} 14return price - (price * dis);5}; const isError = (e) => e && e.name === 'Error';const calculatePrice(price, tax, discount) => { //將要執(zhí)行}
推薦閱讀
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 本次題目蒸花卷時(shí)怎樣讓蔥花翠綠而不變黃
- 伊蘇8跳出解決辦法分享 伊蘇8游戲一直跳出怎么辦
- 《孤島驚魂:原始?xì)⒙尽酚螒蚶鲜翘鲚斎敕▎?wèn)題解決方法解析攻略
- 孤島驚魂原始?xì)⒙酒平獍嫜┑靥鲈趺唇鉀Q?
- 天命奇御2黑屏卡死怎么辦 跳出黑屏打不開(kāi)問(wèn)題解決方法匯總
- 《孤島驚魂3》解決黑屏和崩潰跳出方法
- 2022宜興事業(yè)單位考試地點(diǎn)
- 《群星》軍事基地跳出解決方法
- 《群星》造要塞跳出解決心得分享
- 哪套外觀在5天的投票角逐中勝出成為本次第三期戰(zhàn)令解鎖外觀 天涯明月刀手游3月11日每日一題答案
