对 JavaScript 函数式编程的一些想法

Posted by liveipool on September 2, 2018

对 JavaScript 函数式编程的一些想法

之前看了Underscore.js的源码,对函数式编程有了进一步的了解,因此这个周末开始读起来O’REILLY的《JavaScript函数式编程》,也算是受到了一些启发,在此记录下来。

函数式编程

书上说,如果要用一句话来直白地描述函数式编程:

函数式编程通过使用函数来将值转换成抽象单元,接着用于构建软件系统。

在面向对象编程时,我们会将问题分解为几个小的对象,小的对象“组合”在一起形成更大的对象。而函数式编程,则是将问题分解成几个函数式的部分,函数式编程也通过“组合”其他函数的方式来构建更大的函数,以实现更加抽象的行为。

因此,函数式编程的一般思路可以概括为:

  1. 确定抽象,并为其构建函数。
  2. 利用已有的函数来构建更为复杂的抽象。
  3. 通过将现有的函数传给其他的函数来构建更加复杂的抽象。

在一个面向对象系统的内部,我们发现对象间的交互会引起各个对象内部的变化,而整个系统的状态转变则是由许多小的、细微的状态变化混合来形成的。这些相互关联的状态变化形成了一个概念上的“变化网”,我们时不时会因为它而感到困惑。
相比之下,函数式系统则努力减少可见的状态修改。因此,向一个遵循函数式原则的系统添加新功能,就成了理解如何在存在局限的上下文环境中,通过无破坏性的数据转换,来实现新的函数。并且,通过用局部变量保存原始数据的方法,保持原始数据永远不会发生变化,这里额外的好处在于,操作局部变量的开销比全局变量的开销要小的多,一个优秀的函数应该做到,无论执行多少遍,输入相同时,输出都相同。
然而,并不是说函数式风格和面向对象风格之间应该画一条明显的界限,因为既然JavaScript能同时支持这两种模式,那就说明一个系统可以也应该由这两种模式共同组成。
事实上,并不鼓励说学习了函数式编程就要扔掉曾经学的一切。相反,旨在就它本身来讨论函数式编程,这样就可以确定它是否符合我们的需求。一句不太恰当的俗语,“技多不压身”,用在这里也话粗理不粗。学习JavaScript,我们需要学习它的方方面面,这样我们能对它有更深的理解,才能更清楚的知道,什么适合,什么不可。

我能用函数式编程干什么呢?

在写实际的项目时,我喜欢构建一个全局的utils.js文件,在里面写各种各样的针对于业务需求的函数,每次碰到相关需求的时候直接使用就好了,它的好处在于:

  1. 使代码结构更清晰。
  2. 减少重复代码,在多个文件中可以复用。
  3. 甚至,在多个项目中都能复用,开始一个新项目时,直接把utils.js文件放进去就行了,相同的函数不用再写一遍了。

utils-webank 函数库

在看书的过程中,我突然受到了启发,想起在之前一个多月的工作中,发现的现在一些项目的前端部分其实是有一些痛点的:内容较为相似,虽然有框架和ui库等,但js部分往往才是大头,需要很大的工作量,但一些较为重复的工作没有很好的复用。
因此,我想在自己做项目的过程中,慢慢积累一个较为完善的函数库:utils-webank(它和一些如jQuery、Underscore的区别在于,它更全,更针对于业务需求,并且可以根据实际的业务场景定制相关函数),这样,在以后开发的一些项目中,直接引入这个函数库(一个js文件),就可以提升开发效率,节省很多时间。

参考书籍

《JavaScript函数式编程》 – Micheal Fogus

赞赏码.jpeg