纯函数

概念

纯函数是这样一种函数,与外界交换数据只要一个唯一渠道—参数和返回值。函数从外部接收的所有输入信息都通过参数传递到该函数内部,函数输出到外部的所有信息都通过返回值传递到该函数外部。
纯函数不能访问外部变量,不能修改参数。
纯函数执行过程没有副作用。

通过代码例子来理解纯函数

例子1

let a=1;
let foo = (b)=>{
  return a+b
}
foo(1)

foo函数不是一个纯函数,因为它的返回结果依赖了外部变量a。

例子2

let a=1;
let foo = (b,c)=>{
  return b+c
}
foo(1,2)

foo函数是一个纯函数,因为它的返回结果只依赖于参数b和c。

例子3

const a = 1
const foo = (obj, b) => {
  obj.x = 2
  return obj.x + b
}
const counter = { x: 1 }
foo(counter, 2)

代码里counter.x计算前是1,计算后变成了2,foo函数的执行对外部的counter产生了影响,修改counter属性的值,所以这个foo函数是有副作用的,不是纯函数。
但是如果在函数内部定义了一个变量,并且修改了这个变量,没有对外部产生影响,它是没有副作用的,是一个纯函数,看下面这个例子:
例子4

const a = 1
const foo = (b) => {
  const obj =  { x: 1 }
  obj.x = 2
  return obj.x + b
}
foo(2)

除了修改外部变量,函数在执行过程中还有很多方式可以产生副作用,比如调用DOM API修改页面,发送了ajax请求,调用window.reload刷新了浏览器,console.log往控制台打印数据,等等都是副作用。

Redux程序中的reducer就是一个纯函数,理解了纯函数,对理解Redux的源码有帮助。

你可能感兴趣的:(纯函数)