theme: smartblue
前言
什么是 FRP?
英文全称是:Functional Reactive Programming,翻译过来就是:函数响应式编程。
对于函数式编程,我们并不陌生,在 我的 JS 专栏 里面可以找到很多相关文章~~
这里不妨先对函数式编程特性做简要回顾:
- 函数是一等公民(意味着可以把函数赋值给变量或存储在数据结构中,也可以把函数作为其它函数的参数或者返回值)
- 高阶函数(接受函数作为参数或者返回一个函数的函数)
- 没有隐式输入、输出(输入通过函数入参传递,输出通过函数 return 进行返回)
- 值的不变性(指在程序状态改变时,不直接修改当前数据,而是创建并追踪一个新数据)
- 声明式编程风格,而不是命令式编程风格(关注“是什么”,而不是“做什么”)
用代码举个简单例子:
代码语言:javascript复制// 命令式编程
int factorial1(int x) {
int result = 1;
for (int i = 1; i <= x; i ) {
result *= i;
}
return result;
}
// 函数式编程
int factorial2(int x) {
if (x == 1) return 1;
return x * factorial2(x - 1);
}
以上代码用于实现计算阶乘。指令式编程,像机器一条条命令一样思考问题,一条条指令告诉计算机该怎么去处理这个问题。
而在函数式编程里面,思想是利用数学方法来思考问题。阶乘的数学表达式是:f(n) = n*f(n - 1)
(n > 1)
,f(n) = 1
(n = 1)
,利用递归解决问题。这个过程中基本上没有状态量,只有表达式,也没有赋值语句。
OK,说到这里,对函数式编程有了一个大体的回顾,下面就介绍今天的主角 —— 函数响应式编程
正文
从名字上来看,就是多了 响应 二字,什么是“响应”?
各位一定不陌生!
简答来说就是:当数据发生变动时,会自动触发告知我们:它发生变化了~
Vue.js 底层不就是这种响应式吗?Vue2 通过 definedProperty 的 getter/setter 收集数据变化(依赖收集);
当我们在使用 vue 开发时,只要一有绑定的数据发生改变,相关的数据及画面也会跟着变动,而开发者不需要写关于“如何通知发生变化”的代码,只需要关注发生变化时要做什么事,这就是典型的 Reactive Programming(响应编程) 。
所以,可以大致猜到:函数响应式编程 = 函数式编程 响应编程
事实上,它也确实如此~
一图胜千言:
编程范式关系图(部分)
如图,在声明式编程里,有 2 大家族,分别是函数式编程和数据流编程;数据流编程衍生出响应式编程;而函数响应式编程继承了函数式编程和响应式编程(各自的优点);
- 响应式编程能在运行时改变事件源(随时间变化的数据输入)的绑定处理,但数据流编程的组织是一开始就确定了的。
事件流
函数响应式编程(FRP) 可以更加有效率地处理事件流,而无需管理状态。
举个栗子