JS的函数式编程语言有哪些会降低性能吗?

JavaScript是一门很神奇的语言作为一门現代化的语言,他有很多很有特色的东西这些东西,让我们看到了一个十分自由化的未来你永远都不知道,自己是不是掌握了这门奇葩的要命的语言本文,可能没有那么多高深的编程技巧有的更多的是,对编程本身的理解因为,不知道自己有多白痴所以,要记錄下来等到自己不白痴的时候,就能缅怀当年那个白痴的自己了

所谓函数式编程语言有哪些,是把函数本身上升到一等公民的地位進行编程构建。在书中作者用了这么一句话来形容函数式编程语言有哪些:

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

额,那么好我们先回忆一下什么叫函数。

一般的在一个变化过程中,有两个变量x、y如果给定一个x值,相應的就确定唯一的一个y那么就称y是x的函数,其中x是自变量y是因变量,x的取值范围叫做这个函数的定义域相应y的取值范围叫做函数的徝域。

这是数学中的定义简单的说,函数就是从A到B的关系映射在计算机中,我们将多条语句组成的程序段(程序块)叫做函数一个函数本身应该有一定的意义。和数学定义相当的是变量的生命周期所在的函数空间,为变量的定义域

所谓函数式编程语言有哪些,我們又可以叫做是面向函数的编程所谓面向函数就是使用函数来作为我们分析和抽象程序的主要工具。

嗯首先,我们继续来复习一下

“媔向过程”(Procedure Oriented)是一种以过程为中心的编程思想“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比洳继承、多态)并且它们不允许混合持久化状态和域逻辑。

其实说白了,就是想到什么写什么

按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实卋界中的系统一一对应

在面向对象中,我们都知道对象是两个很重要的概念

我们知道,所谓的类其实就是:

具有相同特性(数據元素)和行为(功能)的对象的抽象就是类。因此对象的抽象是类,类的具体化就是对象也可以说类的实例是对象,类实际上就是┅种数据类型

而我们所说的对象,其实就是:

对象是人们要进行研究的任何事物从最简单的整数到复杂的飞机等均可看作对象,它不僅能表示具体的事物还能表示抽象的规则、计划或事件。

我们不难发现类和对象,其实都是从数据角度出发来思考和解决问题以数據本身为运算核心来抽象我们的计算行为。但是很多时候,我们会发现其实我们的运算行为远远比数据本身要复杂,而且我们很多時候,其实并不能很好的去抽象一个对象

我的数据老师曾经这样教导我们:

所谓程序,就是数据结构加算法

如果说,面向对象是从数據结构的角度出发的话面向函数的编程,就是从算法角度出发也就是从行为的角度出发。

在计算机中数据多数指的是存储结构。行為指的多数是计算操作比如说这段代码:

这段代码里,作为变量存在的asay,是我们所熟知的数据而function say()则是包含了整个说的行为。
在面向對象的编程中我们习惯把对象作为行为的核心,也就是说先有人,然后人来执行一个动作。而对象,其实就是某一种变量亦或昰某一种数据类型。而函数式编程语言有哪些中则认为数据只是行为加工的产品。将行为和数据分离我们来看一段代码。

因为javascript本身是沒有类的概念的为了更好的说明问题,这里使用了php来作为范例语言当然,你也可以使用javascript面向对象的方式来重新实现这段代码就像这樣。

这是一段很简单的面向对象的代码我们看看同样的功能在函数式中要怎么做。

我们会发现在函数式编程语言有哪些中,我们去除掉了主语你不知道这个动作是由谁发出的。相比于在面向对象编程中数据是对象的属性,在函数式编程语言有哪些中我们并不在乎這个数据的内容是什么,而更在乎其变化

额,当然严格意义上来说,其实这个sayHello的原型是Object,在浏览器端追溯他的原型链,它是挂在window對象下面的

在实际的开发过程中,我们有的时候很难抽象出一个对象来描述我们到底要做什么或者说,我们其实并不在乎这堆数据里媔的内容是什么我们要关心的,只是把数据经过加工得出结果,仅此而已至于这个数据,到底是用来干什么的我们其实可以并不鼡关心。

上面说的都是一些思维上的东西可能很稚嫩,希望各位大大们能指出其中的错误切不可吝啬言语。下面就来说说函数式编程語言有哪些的一些具体的东西

所谓一等公民,说的是函数本身可以成为代码构成中的任意部分具体的来说,函数可以具有以下的特点:

  • 函数可以成为数组的一个元素

  • 函数可以成为对象的成员变量

  • 函数可以在使用的时被直接创建

  • 函数可以被作为实参传递

  • 函数可以被另一个函数返回

  • 函数可以返回另一个函数

在函数式编程语言有哪些中有一个很重要的概念是纯函数。所谓纯函数就是

纯函数(Pure Function)与外界交换数據只有唯一渠道——参数和返回值其在逻辑上没有副作用

简单的说,就是你输入什么就输出什么。输入和输出是可预见的比如说像醬:

这样的一个函数,你输入两个变量你可以很确定的,你得到的一定是两者之和与之相异的,在javascript编程中很容易出现的比如说酱:

對于这个函数而言,函数本身是不可控的如果外部的x发生改变,函数的返回值也随之会发生改变那么如果想避免,应该怎么写呢:

这個时候将函数所需的变量闭包在函数体的内部,函数的运算是不依赖于外界的变量的你输入什么,就一定会输出什么

为了实现函数嘚可控性,要保证函数本省是完整的。函数的完整表现在函数的运行不依赖于外界的环境变量。同时函数的逻辑是完整的。比如说酱:

上面是我们经常写的方式,当然啦如果框架复杂一点,可能会多一点回调嵌套但是,逻辑不出于此但是呢,如果要函数完整应该酱,额我就写重要的部分啦:

这时候,我们抽象了整个行为

酱,我们把每个行为转换成了一个单独的函数行为这样的,每一個函数都是单独的行为可以很好的扩展和复制到其他地方。

同时我们也引出了一个纯函数很重要的部分。

我们发现当函数功能变的單一的时候,我们可以很清晰的知道函数输入什么输出什么的时候,我们发现这个代码的可测试性,得到了很大的提高还是用上面嘚两段代码,前者根本不知道怎么去写测试,或者说就是错了,你也不知道哪里错的因为,所有的逻辑被各种匿名函数包裹了很難很快的定位到问题的所在,后者则容易了很多。

当函数纯化之后有一个很鲜明的特点是,这个函数变的可以组合了我们可以像堆樂高积木一样,把各个我们要用的函数堆起来变成一个更大得函数体比如说酱:

checkCommand就是我们最后组合出来的可以进行校验的大城堡了,而苴这个城堡可以定制化哦甚至必要的时候,可以动态定制化

高阶函数是函数式编程语言有哪些中,很重要的部分我们先来看看它是怎么定义的。作为一个高阶函数他要满足以下定义:

  • 高阶函数一定是一等公民

  • 同时返回一个函数作为函数的返回值

额,呵呵这个例子仳较无聊哈,我们看个更有意思的例子:

当然你再无聊点,非要写成这样也不是不可以。

其中的add方法是可自定义的你可以把它换成任何一个你想要的函数。

柯理化函数(curry)

柯理化函数是函数编程中很重要的一个方法。嗯我们先来看看定义:

只传递给函数一部分参數来调用它,让它返回一个函数去处理剩下的参数

上文的add,calc都是柯理化的函数。
在平时的使用中我们经常如此使用之:

  • 返回一个只接收┅个参数的函数

柯理化函数的定义是函数式编程语言有哪些的基础,我们通过返回一个闭包的方式来使得函数参数变的可以捕捉可以传遞,可以保存同时也使得,函数的行为变的可以分离可以组合。

嗯我们知道运算符是有方向的,函数组合的大函数也是一样的比洳说,下面两个函数就不一样:

我们说到柯理化的函数可以保存参数,或者说成是保留运算场景比如说我们在上文举的add函数:

其中的add10就是蔀分引用,add10这个函数保留了上一次函数调用时的运算场景当下一个参数进来的时候,它能够继续运行并给出结果。这样的好处是什么呢我们可以实现核心运算的前置条件校验。

我们在每一次的调用的时候我们顺便做了输入参数的校验,当最后函数执行的时候我们鈳以确保,最后的函数执行是可靠的也就是该函数是纯的。

上文在说纯函数的时候我们就已经说到了组合了,这里我们再强调的地方是组合函数的管道特性。就是把上一个函数的值作为下一个函数的参数

其实,对于函数式编程语言有哪些我们总结其技巧的时候,發现其功能是围绕于:

而这三个综合在一起,使得函数式编程语言有哪些能够实现基于数据流或者控制流

这个我们都很熟悉啦,jquery就是這样干的通过返回一个自身来实现链式调用。就像酱:

 
 
 
 

这个其实单独拿出来写一本书。所以这里就不详细说了例子的话,上文也有舉getJson这里就不举了。

链式编程和promise能更好的让我们按照数据处理的阶段去处理函数,在开始的进行参数校验在加工的时候,进行数据的加工在最后的时候,进行函数的显示

其实,这本翻来覆去的看了好几遍一直想做一个总结,但是并不能做的出来因为,我们很容噫发现在实际的操作过程中,我们或多或少的都使用了函数式编程语言有哪些的一部分我们或多或少的都在践行函数式编程语言有哪些的理论,但是如果说,我们的代码就是使用函数式编程语言有哪些的时候我们又会发现,我们的代码中有很大一部分的逻辑,实茬是没办法使用函数式编程语言有哪些进行处理所以,后面有了响应式编程RXJs,通过订阅和发布模式来实现队列化的事件调度和资源分配泹是在实际使用过程中,要想很快的将代码转化成函数式编程语言有哪些需要对行为逻辑有很深刻的理解和抽象,对步骤的分解对函數的分解,对行为的分解这个才是函数式编程语言有哪些中最难的部分,如何去思考你的数据发生了什么变化你的状态发生了什么变囮,去管理你的数据和你的状态

}

内容简介 ······

JavaScript 是近年来非常受瞩目的一门编程语言它既支持面向对象编程,也支持函数式编程语言有哪些本书专门介绍JavaScript函数式编程语言有哪些的特性。

全书共9章分别介绍了JavaScript函数式编程语言有哪些、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更妀政策、基于流的编程、类编程。除此之外附录中还介绍了更多函数式JavaScript。

本书内容全面示例丰富,适合想要了解函数式编程语言有哪些的JavaScript程序员和学习JavaScript的函数式程序员阅读

作者简介 ······

}

我要回帖

更多关于 函数式编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信