纯函数

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

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

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

function fun1(a,b){

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

var a =1;
function fun2(b){

  return a+b

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

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. 同样的输入,必然是同样的结果。

Last updated