概念
纯函数是这样一种函数,与外界交换数据只要一个唯一渠道—参数和返回值。函数从外部接收的所有输入信息都通过参数传递到该函数内部,函数输出到外部的所有信息都通过返回值传递到该函数外部。
纯函数不能访问外部变量,不能修改参数。
纯函数执行过程没有副作用。
通过代码例子来理解纯函数
例子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的源码有帮助。
网友评论