译者按: 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!!javascript
为了保证可读性,本文采用意译而非直译,而且对源代码进行了大量修改。另外,本文版权归原做者全部,翻译仅用于学习。css
从1997年网景的Navigator 3浏览器开始就开始使用JavaScript。当时,JavaScript还只能作一些很简单的事情。我记得最酷的就是用JavaScript实现mouseover特性,在那个时候已经算得上是高科技了!当鼠标移过去以后,文本内容就神奇的改变了。由于当时都是pre-DHTML,你根本不须要隐藏或则显示DOM元素。html
关于DHTML(之前的 DHTML 现在是否是也算前端?):前端
DHTML是Dynamic HTML的简称,就是动态的html(标准通用标记语言下的一个应用),是相对传统的静态的html而言的一种制做网页的概念。所谓动态HTML(Dynamic HTML,简称DHTML),其实并非一门新的语言,它只是HTML、CSS和客户端脚本的一种集成,即一个页面中包括html+css+javascript(或其它客户端脚本),其中css和客户端脚本是直接在页面上写而不是连接上相关文件。java
在那个时候,JavaScript的演化很慢,主要应用在表单验证。所以,不像今天这么火爆,并无引发太多的关注。能够说只是一个锦上添花的附加物,你须要确保在浏览器禁用JavaScript以后,你的应用依然能够正常使用。再日后,框架一个接着一个出现:jQuery,Knockout, Angular, React, Vue, 等等。redis
一样,JavaScript也在加速演化。咱们才使用ES6不久,如今人们几乎已经跳过ES7,开始讨论ES8了。编程
而且,咱们有不少替代品,好比TypeScript,CoffeScript,ClojureScript, ELM,等等。浏览器
咱们已经被太多的框架和语言所淹没,很难去跟踪和掌握全部的语言和框架。闭包
当JavaScript逐渐成熟,面向对象编程(OOP)的概念也渗入进来,并且我曾经很喜欢。框架
我开始尝试全部不一样的方法来建立类,我最终也能够正确的使用继承。我对本身说:JavaScript开始真的像一个语言了!
可是,直到多年之后我发现OOP是JavaScript引入的最糟糕的一个设计!
我尝试将我对C#的理解带入到JavaScript中去。一开始充满期待,可是后来发现真的太复杂,太烧脑了。
这主要是由于JavaScript的原型继承和C#不同,我已经习惯于天天编写相似于console.log(this)
这样飘逸的代码。可是如今呢?若是我一不当心没按照规则来,那将会给我带来噩梦。私有方法和私有值必需要在名字前面加上下划线,甚至必须用闭包来保证私有性。
所以,不只OOP致使了不少问题,同时也因为添加OOP带来了不少新的问题。
一开始我并不理解。我能够阅读并理解这些用函数式编写的代码,可是不知道为何!最终,我强迫我本身去学习它。我在在线教育网站EDX免费学习了函数式语言的入门课程,而后尝试把这些技术运用到JavaScript中去。
函数式语言给了我一个全新的视角,让我从一个彻底不一样的方式去看待编程。
一开始会感到不天然,须要时间去适应。全部的定义都是基于函数,值不可更改,无状态。我用函数式的思惟去解决问题。由于不熟悉,我花了更长的时间去学习。渐渐地,我熟练掌握了使用函数式的方法去编程。而且,我也知道全部代码这样编写的内在含义。
个人代码更加简洁了,并且容易复用。渐渐的,我之前使用的那些语言特性从代码中消失了,个人代码看上去完像是用另外一个语言编写。我还在用JavaScript吗?
我用const替代了var。经过函数式的设计,个人函数都是纯(pure)的。不会再去对一个变量进行值的变动操做,一样也是为了确保不会对其操做。
我会检查代码确保每个var,甚至let,全部声明都使用const。
在学习程序语言的时候,咱们一开始就会学到for循环。可是自从学习了函数式编程,我将for循环都改为了使用filter, map和reduce来实现。对于那些须要一些额外计算的需求,我会使用递归或则第三方库好比lazy.js。
在此,推荐个人另一篇专门介绍for循环博客:Rethinking JavaScript: Death of the For Loop
现在个人代码里面彻底没有for循环了,若是你看到了,告诉我我会把它消除。
我开始中止在if里面编写大块大块的代码。我将里面的逻辑抽取出来单独放在一个函数中。这样,咱们就能够将if用三元算子(a?b:c)来简化。
在此,推荐个人另一篇专门介绍if博客:Rethinking JavaScript: The if statement
现在个人代码里面几乎没有if语句。为了方便其余开发者理解个人代码,我不多使用它。
一样,我也不喜欢用switch,而是寻找一个函数式的写法。
推荐个人博客: Rethinking JavaScript: Eliminate the switch statement for better code
我也很喜欢用Ramda的cond算子来替代swtich。
对的,你没有听错!咱们也能够彻底消除this。
函数式的JavaScript可让你彻底抛弃使用烦人的this
如今只有数据和函数,甚至数据不过是函数的一种特殊表达形式,你不再须要this了。我开始将对象理解为函数式语言中状态(state)和函数。我甚至不须要把状态或则函数和对象绑定到一块儿,就像OOP中那样。
我写了一篇博客专门介绍如何解耦: Functional JavaScript: Decoupling methods from their objects
如今往回看,我发现面型对象编程带来的复杂度真的是没必要要的。我可使用函数式语言实现一样的功能,完成相同的任务。并且,代码更加轻简,由于不在须要将这些复杂的对象传来传去。只有数据和函数,并且由于函数没有和对象绑定,更加容易复用。我不在须要担忧传统的原型继承带来的全部的问题,JavaScript设计的并很差。
JavaScript缺少私有、公有、内部或则被保护这类访问控制器也再也不是一个问题。访问控制器是用来解决因为引入面向对象编程而设计的。在函数式的JavaScript中,这些问题不复存在。
个人代码如今看上去彻底不一样。它包含了不少纯函数,我将它们作成不一样的ES6模块。这些函数能够被使用来构建更加复杂的函数。很大一部分函数都是很简单的一行lambda表达式。
如今我看待软件的思惟也变了:输入是一个数据流,而后程序做用到该数据流上对数据进行各类操做,而后返回新的数据。
函数式设计对程序语言的影响以及无处不在,C#中的LINQ就是一个最佳的例子。一样Java 8也引入了函数式语言的特性。
版权声明:
转载时请注明做者Fundebug以及本文地址:
https://blog.fundebug.com/201...