什么是纯函数?
1. 唯一结果
let xs = [1,2,3,4,5]// 纯函数xs.slice(0,3) //[1,2,3]xs.slice(0,3) //[1,2,3]xs.slice(0,3) //[1,2,3]// 不纯函数xs.splice(0,3) //[1,2,3]xs.splice(0,3) //[4,5]xs.splice(0,3) //[]
将一个函数反复执行,其中的值已经被改变了,从而影响后面的函数操作。一个纯函数是无论什么输入,都只对应输出一个唯一值。
2. 不接受外部状态
var min = 21;// 不纯函数var ckeck = function(age){ return age >= min;}// 纯函数var check = function(age){ var min = 21; return age >= min;}
3. 更清晰的表达
一个优秀的纯函数应该具有可移植性/自文档化
,即通过输入内容,就可以看出函数的意图。
// 不纯的var signUp = function(attrs){ 一些副作用操作}// 纯的var signUp = function(Db, Email, attrs){ return function(){ ...一些副作用操作 }}
优点:没有副作用
副作用指,在进行操作的时候,更改了原有数据的形态,从而影响了数据的纯洁性,对于此类数据应该放置在return
里面。
副作用
- 更改文件系统
- 往数据库插入记录
- 发送一个 http 请求
- 打印/log
- DOM 查询
优点:可缓存性
采用memoize技术可以进行缓存。
var square = memoize(function(x){ return x*x})square(4) //16square(4) //从缓存中读取结果16