JavaScript是一种发展迅速的语言 。这篇文章,我想展示一些有关如何在JavaScript中应用函数式编程的示例 。
JavaScript中的函数式编程即使函数式编程可以极大地改善应用程序的代码,但其原理在开始时可能会有些挑战 。由于详细解释所有这些都将花费大量时间,因此我们决定使用两个实际的代码示例来介绍这些概念

1.Maybe Monad在第一个示例中,我们找到一种避免验证变量是否为Null的方法 。假设在我们的应用程序中,我们可以找到具有以下格式的用户:
const someUser = { name: 'some_name', email: 'some@email.com', settings: {language: 'sp' }};有一个功能,可以以用户设置的语言返回欢迎消息 。const allGreetings = { 'en': '嗨', 'sp': '你好', 'fr': '欢迎你'};const getGreetingForUser = (user) => { //将要执行}来看一个遵循命令式模型的“ getGreetingForUser”函??数的实现: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));如上面所看到的,必须检查用户是否已经存在,是否已设置语言,以及是否已准备好欢迎消息 。如果出现问题,我们将以默认语言返回一条消息 。现在,让我们看一下相同的函数,但是这次我们将在其实现中使用函数式编程:
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 。这使我们可以在对象周围创建包装器,并为空对象分配默认行为 。
让我们比较两种解决方案:
//代替验证用户是否为空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'])) //如果存在数据,映射将会用它//不是在else中返回默认值: return indexURLs['en'];.getOrElse(allGreetings 。EN)// 指定的默认值 。2 Either Monad当我们知道存在空错误时的默认行为时,Maybe Monad非常有用 。但是,如果我们有一个引发错误的函数,或者我们将各种引发错误的函数链接在一起,并且我们想知道哪个发生了故障,则可以改用Either Monad 。

现在,让我们假设我们要计算产品的价格,同时考虑增值税和可能的折扣 。我们已经有了以下代码:
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) => { //将要执行}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 本次题目蒸花卷时怎样让葱花翠绿而不变黄
- 伊苏8跳出解决办法分享 伊苏8游戏一直跳出怎么办
- 《孤岛惊魂:原始杀戮》游戏老是跳出输入法问题解决方法解析攻略
- 孤岛惊魂原始杀戮破解版雪地跳出怎么解决?
- 天命奇御2黑屏卡死怎么办 跳出黑屏打不开问题解决方法汇总
- 《孤岛惊魂3》解决黑屏和崩溃跳出方法
- 2022宜兴事业单位考试地点
- 《群星》军事基地跳出解决方法
- 《群星》造要塞跳出解决心得分享
- 哪套外观在5天的投票角逐中胜出成为本次第三期战令解锁外观 天涯明月刀手游3月11日每日一题答案
