const a1 = 10; const aFunc1 = () => { // 依赖外部变量 return a1; }
依赖外部环境的函数在运行时必须知足环境条件,如上,aFunc1在a1建立以前运行,就出错了。javascript
2.不产生反作用。所谓反作用,是一切与外部交互的做用,好比console.log,IO,网络请求等。这些操做的结果是不可预计的,因此当包含反作用操做的函数执行后,结果是不可预计的。好比IO读写失败,网络出现问题,console.log一般没什么问题,但这仍然是外部的。举个片面的例子,在react里使用,就有可能由于打印某个在将来会被改变的状态,致使组件没必要要的被刷新。java
3.函数与外部的合法交互只能经过参数传递的方式。react
函数式编程,本质上是数学,它是数学现有理论在编程上的实现,在数学上,一个定理成立一般要知足一些数学条件,函数式编程也须要知足条件,这个条件就是函数必须是纯函数。 git
如上图,能够用一个函数表达式描述,即y = f(x),这是一种一一对应关系,输入x能获得惟一的结果y。也就是说x通过f的转换变成y,这个过程是稳定的,肯定的,以此类推,y也能够通过某种肯定的转换g,变成z,那么就具备以下等式: 编程
\[y = f(x) = 2x\]网络
\[z = g(y) = y + 1\]ide
\[z = g(f(x)) = w(x) = 2x + 1\]函数式编程
也就是说x通过w转换,能够变成z 函数
某个状态通过多个函数转换成另外一个状态,那么中间转换过程能够结合成一个转换,这大大的使问题简化,这是函数式编程带来的好处,并且只是一部分的好处,而这都基于纯函数。 ui
固然,咱们知道,**不少时候没法避免使用反作用**。就如发送消息,必须通过网络。那是否函数式编程没有实际运用价值呢?固然不是。全部事情都不该该极端的理解,函数式编程的种种定理必须以纯函数做为根基,目的是写出健壮的,声明式的代码。能够利用函数式编程中如curry,functor,monad等奇巧淫记,将反作用加以限制并降到最低限度,保证代码的大部分是纯的。