这篇文章主要讲解了“什么是JavaScript函数式编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是JavaScript函数式编程”吧!JavaScript 函数式编程是一个存在了很久的话题,但似乎从 2016 年开始,它变得越来越火热。这可能是因为 ES6 语法对于函数式编程更为友好,也可能是因为诸如 RxJS (ReactiveX) 等函数式框架的流行。看过许多关于函数式编程的讲解,但是其中大部分是停留在理论层面,还有一些是仅针对 Haskell 等纯函数式编程语言的。而本文旨在聊一聊我眼中的函数式编程在JavaScript中的具体实践,之所以是 “我眼中的” 即我所说的仅代表个人观点,可能和部分严格概念是有冲突的。本文将略去一大堆形式化的概念介绍,重点展示在 JavaScript 中到底什么是函数式的代码、函数式代码与一般写法有什么区别、函数式的代码能给我们带来什么好处以及常见的一些函数式模型都有哪些。我认为函数式编程可以理解为,以函数作为主要载体的编程方式,用函数去拆解、抽象一般的表达式与命令式相比,这样做的好处在哪?主要有以下几点:语义更加清晰可复用性更高可维护性更好作用域局限,副作用少下面例子是一个具体的函数式体现当情况变得更加复杂时,表达式的写法会遇到几个问题:鸿蒙官方战略合作共建——Har免费云主机、域名monyOS技术社区表意不明显,逐渐变得难以维护复用性差,会产生更多的代码量会产生很多中间变量函数式编程很好的解决了上述问题。首先参看函数式写法一,它利用了函数封装性将功能做拆解(粒度不***),并封装为不同的函数,而再利用组合的调用达到目的。这样做使得表意清晰,易于维护、复用以及扩展。其次利用高阶函数,Array.map
代替for…of
做数组遍历,减少了中间变量和操作。而函数式写法一和函数式写法二之间的主要差别在于,可以考虑函数是否后续有复用的可能,如果没有,则后者更优。从上面函数式写法二中我们可以看出,函数式代码在写的过程中,很容易造成横向延展,即产生多层嵌套,下面我们举个比较极端点的例子。本例仅为展示横向延展的比较极端的情况,随着函数的嵌套层数不断增多,导致代码的可读性大幅下降,还很容易产生错误。在这种情况下,我们可以考虑多种优化方式,比如下面的链式优化。这样改写后,结构会整体变得比较清晰,而且链的每一环在做什么也可以很容易的展现出来。函数的嵌套和链式的对比还有一个很好的例子,那就是回调函数 和 Promise 模式。随着回调函数嵌套层级和单层复杂度增加,它将会变得臃肿且难以维护,而Promise
的链式结构,在高复杂度时,仍能纵向扩展,而且层次隔离很清晰。可以保留局部变量不被释放的代码块,被称为一个闭包闭包的概念比较抽象,相信大家都或多或少知道、用到这个特性那么闭包到底能给我们带来什么好处?先来看一下如何创建一个闭包:makeCounter
这个函数的代码块,在返回的函数中,对局部变量k
,进行了引用,导致局部变量无法在函数执行结束后,被系统回收掉,从而产生了闭包。而这个闭包的作用就是,“保留住“ 了局部变量,使内层函数调用时,可以重复使用该变量;而不同于全局变量,该变量只能在函数内部被引用。换句话说,闭包其实就是创造出了一些函数私有的 ”持久化变量“。所以从这个例子,我们可以总结出,闭包的创造条件是:鸿蒙官方战略合作共建——HarmonyOS技术社区存在内、外两层函数内层函数对外层函数的局部变量进行了引用闭包的主要用途就是可以定义一些作用域局限的持久化变量,这些变量可以用来做缓存或者计算的中间量等等。上面例子是一个简单的缓存工具的实现,匿名函数创造了一个闭包,使得store
对象 ,一直可以被引用,不会被回收。持久化变量不会被正常释放,持续占用内存空间,很容易造成内存浪费,所以一般需要一些额外手动的清理机制。接受或者返回一个函数的函数称为高阶函数听上去很高冷的一个词汇,但是其实我们经常用到,只是原来不知道他们的名字而已。JavaScript 语言是原生支持高阶函数的,因为 JavaScript 的函数是一等公民,它既可以作为参数又可以作为另一个函数的返回值使用。我们经常可以在 JavaScript 中见到许多原生的高阶函数,例如Array.map
,Array.reduce
,Array.filter
下面以map
为例,我们看看他是如何使用的映射是对集合而言的,即把集合的每一项都做相同的变换,产生一个新的集合map
作为一个高阶函数,他接受一个函数参数作为映射的逻辑上面一般写法,利用for...of
循环的方式遍历数组会产生额外的操作,而且有改变原数组的风险而map
函数封装了必要的操作,使我们仅需要关心映射逻辑的函数实现即可,减少了代码量,也降低了副作用产生的风险。给定一个函数的部分参数,生成一个接受其他参数的新函数可能不常听到这个名词,但是用过undescore
或lodash
的人都见过他。有一个神奇的_.partial
函数,它就是柯里化的实现通过_.partial
,我们得到了新的函数relativeFromBase
,这个函数在调用时就相当于调用path.relative
,并默认将***个参数传入BASE
,后续传入的参数顺序后置。本例中,我们真正想完成的操作是每次获得相对于BASE
的路径,而非相对于任何路径。柯里化可以使我们只关心函数的部分参数,使函数的用途更加清晰,调用更加简单。将多个函数的能力合并,创造一个新的函数同样你***次见到他可能还是在lodash
中,compose
方法(现在叫flow
)_.flow
将转大写和转 Base64 的函数的能力合并,生成一个新的函数。方便作为参数函数或后续复用。我理解的 JavaScript 函数式编程,可能和许多传统概念不同。我并不只认为高阶函数算函数式编程,其他的诸如普通函数结合调用、链式结构等,我都认为属于函数式编程的范畴,只要他们是以函数作为主要载体的。而我认为函数式编程并不是必须的,它也不应该是一个强制的规定或要求。与面向对象或其他思想一样,它也是其中一种方式。我们更多情况下,应该是几者的结合,而不是局限于概念。感谢各位的阅读,以上就是“什么是JavaScript函数式编程”的内容了,经过本文的学习后,相信大家对什么是JavaScript函数式编程这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!
相关推荐: Canvas引入跨域图片导致toDataURL()报错如何解决
本篇内容主要讲解“Canvas引入跨域图片导致toDataURL()报错如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Canvas引入跨域图片导致toDataURL()报错如何解决”吧!【场景】用户打开网页…