纯函数概念
-
纯函数:相同的输入 会有相同的结果,而且没有任何可观察的副作用
-
纯函数类似数学中的映射
-
lodash是一个纯函数的功能库,提供了对数组,字符串,对象,数字,函数等操作的一些方法。
-
slice和splice分别是纯函数和不纯函数
- slice返回数组中的指定部分,不会改变原数组
- splice 对数组进行删除,替换或者增加,会改变原数组
-
let arr=[1,2,3,4,5,6] console.log(arr.slice(1,4)) //[2, 3, 4] console.log(arr.slice(1,4)) //[2, 3, 4] console.log(arr.slice(1,4)) //[2, 3, 4] console.log(arr.splice(1,4)) //[2, 3, 4, 5] console.log(arr.splice(1,4)) //[6] console.log(arr.splice(1,4)) //[] //可以看出 slice 相同的输入 三次输出都相同 //而 splice改变了原数组虽然两次都是相同的输入但是输出不同 所以是不纯的函数
-
-
纯函数的好处
-
可缓存
- 因为纯函数相同的输入始终有相同的输出,所以可以把纯函数的结果缓存起来。
-
可测试
- 纯函数让测试更方便
-
并行处理
- 在多线程环境下并行操作共享的数据很可能会出现意外情况
- 纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数(es6 Web worker)
-
-
副作用
-
副作用让一个函数变得不纯,纯函数的根据相同的输入返回相同的输出,如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用
-
//不纯的 let min=12; function little(arg){ return age>=min } -
副作用的来源:
- 配置文件
- 数据库
- 获取用户的输入...
-
所有的外部交互都有可能带来副作用
-
柯里化
- 柯里化 模拟
-
function curry(fnc){ return function curried(...args){ //判断形参fnc和实参args的长度 if(args.length>fnc.length){ return function(){ return curried(...args.concat(Array.from(arguments))) } } return fnc(...args) } } - 柯里化 可以让我们传递较少的参数得到一个 已经记住了某些固定参数的新函数
- 这是一种对函数参数的“缓存”
- 让函数变得更灵活,让函数的粒度更小
- 可以吧多元函数转换成一元函数,可以组合使用函数产生强大的功能
\