# 纯函数

## 原文地址：[https://juejin.im/post/5a92a12f6fb9a063543c4c2b#comment](https://juejin.im/post/5a92a12f6fb9a063543c4c2b#comment)

之前在学习redux的时候有接触到纯函数这个概念，也没有仔细的研究。现在对这个概念还是模棱两可的。

**纯函数：函数执行后的结果只与传入的参数有关，并且不受系统环境变化、调用环境与次序的影响，网上说也就是函数执行时没有副作用，通俗的讲是，同样的操作，得到的一定是同样的结果。通过下面的例子来理解这句话的意思**

* 不管有没有参数，何时调用，fun1调用后结果都是一样的。

```javascript
function fun1(a,b){

   return a+b ;
};
```

* 如下不是纯函数，因为函数里引用到了全局变量a ,所以fun2的执行结果受到全局变量a的影响，a可能会变化！，要是把a当参数传入函数则是纯函数。

```javascript
var a =1;
function fun2(b){

  return a+b

}
```

* **当传入的参数是对象,这时参数是这个对象的引用地址，当对象改变的时候，函数的执行结果还是变化了，虽然是传入的是同一个参数,这就是系统变化的时候。**

```javascript
var obj = {name:"test"};

function fun1(a,b){

    retrun a.name+b;
}

var str1 = fun1(obj,'age');
obj.name = "change";
var str1 =fun1(obj,'age');
```

* 当在函数里获取dom节点的时候,也是会产生副作用的。如果这个dom节点发生变化，函数的结果也不一样了。
* 在在函数里依赖别的函数，这样当依赖的函数功能发生变化的时候，函数的执行结果也不一样了。

## 在编程的时候。一般都没怎么写纯函数，因为

1. 这样传入的参数就变得很多了。
2. 功能分的更细了，写的方法更多了

## 优点也很多：

1. 复用性很高，不需要考虑执行环境，也就是上下文。
2. 结果很明确
3. 对执行的顺序没有要求
4. 同样的输入，必然是同样的结果。
