《JS函数式编程指南》使用
JavaScript
讲述了函数式编程的基本思想,函数式编程有不少优势,好比简洁,消除"反作用"等等。同时它是来源数学理论,能够达到更高的抽象度。
函数式编程
也叫面向函数编程
,是编程范式的一种,它其实出现得很早,理论基础起源于上个世纪30年代数学界的lambda
演算,属于范畴论
,最先运用这一思想的编程语言是上世纪50年代的Lisp
语言,这门语言在黑客圈极具传奇色彩。javascript
另外一种更为你们知道的编程范式就是大名鼎鼎的面向对象编程
(固然,面向“对象”编程,是程序猿的梦想之一)。十年以前,咱们接触到的编程教材、技术文章,讲述的几乎都是面向对象编程,编程不使用接口、类、继承
,都很差意思说本身会编程。java
函数式编程思想近几年愈来愈为你们接受和推崇,两大主流语言相继增长了支持函数式编程的特性:程序员
Java8
新增了Lambda
表达式,同时增长了相关应用场景的支持,如Stream
流式处理;面试
JavaScript
也在ES6
增长了Lambda
表达式,也增长了相关应用场景的支持,如Array
的map, fliter, reduce
操做。同时,JavaScript
的三大框架之一React,今年新增了Hooks特性,支持有状态函数组件,从而彻底能够替代类组件。数据库
从大的趋势来看,各大主流语言逐渐趋于支持多种范式,如JavaScript同时也增长了面向对象的特性:类和继承。编程
这是函数式编程一个基本条件,这里并非说函数有什么优先权,而是:函数和其它数据类型同样,能够赋值给变量、能够做为参数传递、能够做为返回值等等。后端
根据上面的特色,咱们还能够引伸出来一些概念:设计模式
这些JS开发者都很熟悉,也会常常用到,等后面再回过头看看这些特性在函数式编程里面有什么使用场景。数组
代码示例:网络
// 嵌套函数,返回函数 function regexCheck(reg) { return function(str) { return reg.test(str) } } // 高阶函数 regexCheck(/^(130|131)\d{8}$/)('13012341234')
表达式的特色是:它是一个单纯的运算过程,完成后老是会有运算结果。最多见的表达式就是运算表达式,好比:
const a = 10 const b = a * 10 + 10
函数式编程里的表达式,其实就是把函数看成普通变量来使用:
// 参数函数,返回函数 function ifNot(func) { return function(x) { return !func(x) } } // 函数组合 const isHtmlTag = regexCheck(/<\/?\S+>/) ;['hello world', '<script>alert(1)</script>'].filter(ifNot(isHtmlTag))
把函数看成变量同样来运算,代码能够变得很简洁灵活(后续还会接触更多的)。
这里的"反作用"就是Side Effect
,指的就是:函数运行过程当中,产生了运算之外的其余结果,好比:修改了全局变量、向数据库写入了数据、发起了网络请求等等。
函数式编程为何要消除“反作用”,经验丰富的程序员必定知道,系统复杂性和Bug不少时候就是因"反作用"而起:
固然,咱们也不能彻底避免反作用,咱们要作的是控制它,状态管理器Redux
中就有effects
概念,React Hooks
里面也有effect hook
,目的都是隔离“反作用”。
消除"反作用"有一个常见的方案:不改变状态,即函数调用返回新的值,如:
const serials = ['10', '20', '30'] // 下面的运算不会改变前面的变量 const serialsOpts = serials.concat(['40', '50']).join('/')
引用透明其实就是前面特性的衍生特性,说的就是:使用相同的参数调用函数,每次都会获得相同的结果。 咱们彻底能够用结果代替这个函数表达式,因此叫引用透明。
当一个函数不依赖外部变量和状态时,它就能够知足引用透明,这样的函数咱们也叫它纯函数。
它的好处不少:
函数编程起源于数学的范畴论,理论至关抽象,我仍是个初学者,本篇简单介绍了函数式编程的历史和现状,讲述了函数式编程的基本特色。后续我还会继续学习和记录函数式编程的相关理论、常见设计模式和它们的应用。
我的读书公众号,欢迎交流!