一.函数式编程

1.声明式(Declarativ)

和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式。

//命令式编程:
function double(arr) {
const results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] * 2)
}
return results
}
function addOne(arr){
const results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] +1)
}
return results
}
//声明式:
const double = arr => arr.map(item => item * 2);
const addOne = arr => arr.map(item => item + 1);

2.纯函数(Pure Function)

  • 函数的执⾏过程完全由输⼊参数决定,不会受除参数之外的任何数据影响。简单的说,一个函数当它的输入值一致时,返回值永远是一致的。
  • 函数不会修改任何外部状态,⽐如修改全局变量或传⼊的参数对象。

相反的不纯函数:

  • 改变全局变量的值。
  • 改变输⼊参数引⽤的对象,就像上⾯不是纯函数的arrayPush实现。
  • 读取⽤户输⼊,⽐如调⽤了alert或者confirm函数。
  • 抛出⼀个异常。
  • ⽹络输⼊/输出操作,⽐如通过AJAX调⽤⼀个服务器的API。
  • 操作浏览器的DOM。

满⾜纯函数的特性也叫做引⽤透明度(Referential Transparency),这是更加正式的说法。怎么称呼不重要,重要的是开发者要理解,所谓的纯函数,做的事情就是输⼊参数到返回结果的⼀个映射,不要产⽣副作⽤(Side Effect)。

3.数据不可变性(Immutability)

数据不可变(Immutable)是函数式编程⾮常重要的⼀个概念,程序要好发挥作⽤当然是要产⽣变化的数据,但是并不意味着必须要去修改现有数据,替换⽅法是通过产⽣新的数据,来实现这种“变化”,也就是说,当我们需要数据状态发⽣改变时,保持原有数据不变,产⽣⼀个新的数据来体现这种变化。不可改变的数据就是Immutable数据,它⼀旦产⽣,我们就可以肯定它的值永远不会变,这⾮常有利于代码的理解。

注意:JavaScript中的const关键字虽然有常数(constant)的意思,但其实只是规定⼀个变量引⽤的对象不能改变,却没有规定这个const变量引⽤的对象⾃⾝不能发⽣改变,所以,这个“常量”依然是变量。

问题:javascript算不算函数式编程语言?

从语言的角度上讲,javascript并是纯粹的函数式编程语言,JavaScript中的函数有第⼀公民的⾝份,因为函数本⾝就是⼀个对象,可以被赋值给⼀个变量,可以作为参数传递,由此可以很⽅便地应⽤函数式编程的许多思想。我们把函数式编程看作⼀种编程思想,即使语⾔本⾝不⽀持⼀些特性,我们依然可以应⽤这样的编程思想,⽤于提⾼代码的质量。所以,JavaScript并不是纯粹的函数式编程语⾔,但是,通过应⽤⼀些编程规范,再借助⼀点⼯具的帮助,我们完全可以⽤JavaScript写出函数式的代码,RxJS就是辅助我们写出函数式代码的⼀种。

二.响应式编程(Reactive Programming)

就像excell,试着⽤Excel把多个星期的花费综合加起来放在另⼀个叫c9格⼦⾥,c9能够对花费的格⼦的数值变化作出“响应”。

例如,在命令式编程环境中, a:=b+c表示将表达式的结果赋给 a,而之后改变 b 或 c的值不会影响 a。但在响应式编程中,a的值会随着 b或 c的更新而更新。

Reactive Extension 简称 Rx(响应式编程世界⾥知名度最⾼的框架)

An API for asynchronous programming with observable streams 。 Rx是⼀套通过可监听流来做异步编程的API。

Rx其实是⼀个⼤家族,在这个⼤家族中,还有⽤Java实现的RxJava,⽤C++实现的RxCpp,⽤Ruby实现的Rx.rb,⽤Python实现的RxPy,当然,还有这个⼤家族中最年长的Rx.NET。RxJS,也就是Rx的JavaScript语⾔实现。

Rx(包括RxJS)诞⽣的主要⽬的虽然是解决异步处理的问题,但并不表⽰Rx不适合同步的数据处理,实际上,使⽤RxJS之后⼤部分代码不需要关⼼⾃⼰是被同步执⾏还是异步执⾏,所以处理起来会更加简单。

RxJS 属于“函数响应式编程”。

函数响应式编程的优势

  • 数据流抽象了很多现实问题。
  • 擅长处理异步操作。
  • 把复杂问题分解成简单问题的组合。

RxJS入门之函数响应式编程的更多相关文章

  1. 函数响应式编程(FRP)从入门到”放弃”——基础概念篇

    前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...

  2. ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!

    简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模 ...

  3. 函数响应式编程(FRP)—基础概念篇

    原文出处:http://ios.jobbole.com/86815/. 一函数响应式编程 说到函数响应式编程,就不得不提到函数式编程,他们俩有什么关系呢?今天我们就详细的解析一下他们的关系. 现在下面 ...

  4. 函数响应式编程及ReactiveObjC学习笔记 (-)

    最近无意间看到一个视频讲的ReactiveObjC, 觉得挺好用的 但听完后只是了解个大概. 在网上找了些文章, 有的写的比较易懂但看完还是没觉得自己能比较好的使用RAC, 有的甚至让我看不下去 这两 ...

  5. 函数响应式编程(FRP)框架--ReactiveCocoa

    由于工作原因,有段时间没更新博客了,甚是抱歉,只是,从今天開始我又活跃起来了,哈哈,于是决定每周更新一博.大家互相学习.交流. 今天呢.讨论一下关于ReactiveCocoa,这个採用函数响应式编程( ...

  6. 函数响应式编程(FRP)思想-Callback风格

    序 ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP.FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁 ...

  7. 函数响应式编程RxJava

    RxJava 到底是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event- ...

  8. 函数响应式编程及ReactiveObjC学习笔记 (二)

    之前我们初步认识了RAC的设计思路跟实现方式, 现在我们再来看看如果使用它以及它能帮我们做什么 One of the major advantages of RAC is that it provid ...

  9. 函数响应式编程及ReactiveObjC学习笔记 (三)

    之前讲了RAC如何帮我们实现KVO / 代理 / 事件 / 通知 今天先不去分析它的核心代码, 我们先看看ReactiveObjC库里面一些特别的东西,  如果大家点开ReactiveObjC目录应该 ...

随机推荐

  1. 源码安装php时出现configure: error: xml2-config not found. Please check your libxml2 installation

    1.检查是否安装了libxml 包 > rpm -qa|grep libxml2 2.如果没有则安装 > yum install libxml2 > yum install libx ...

  2. HTML5新协议介绍 WebSocket

    WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站为了实现即时通讯(real-time) ...

  3. 深入php内核,从底层c语言剖析php实现原理

    深入php内核,从底层c语言剖析php实现原理 非常好的电子书:http://www.cunmou.com/phpbook/preface.md   这是它的目录: PHP的生命周期 让我们从SAPI ...

  4. dumpbin 查看dll中的导出函数

    C:\Program Files (x86)\Microsoft Visual Studio 14.0>dumpbin -exports E:\20171110\Release\aa.dll h ...

  5. 优秀UX设计师的八条黄金法则

    与用户保持亲密   成为成功的UX设计师最重要的先决条件之一就是与用户保持紧密的联系,以发现和了解他们的需求和爱好.理想情况下你应该让自己完全地成为产品用户,因为只有这样你才能理解背后的动机.“这样的 ...

  6. oracle 表分区例子

    oracle表分区详解-一步一步教你oracle分区表详解   .创建三个不同的表空间,模拟在不同磁盘上的保存不同范围的数据    create tablespace test01 datafile ...

  7. 8.15jsp document 头部声明 区别

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 用winsw让任何Windows程序都能运行为服务

    用winsw让任何Windows程序都能运行为服务 winsw介绍 有时候我们需要在Windows下开机运行某些程序,这对于有图形界面的程序来说一般不是什么事,在选项中选中开机启动,然后它们就可以自动 ...

  9. 2018.09.11 bzoj47214721: [Noip2016]蚯蚓(单调队列)

    传送门 好题. 目测只会多带一个log2(n+m)" role="presentation" style="position: relative;"& ...

  10. DevExpress gridcontrol Master-Detail绑定到对象类型

    数据库:C_ProductPlan ,C_ProductPlanItemDTO定义:(实现每个计划条目-Master,对应多个ProcessInfo-Detail) [DataContract] [S ...