纯函数
概念
相同的输入必然得到相同的输出。举个例子:
array.slice(0,2); //纯函数
array.splice(0,2);//非纯函数,因为splice会改变原数组
纯函数相关工具库:lodash
优点
-
可缓存
function getArea(r) { console.log(r); return Math.PI * r * r; } function memoize(fn) { let cache = {}; return function () { let key = JSON.stringify(arguments); cache[key] = cache[key] || fn.apply(fn, arguments); return cache[key]; } } let getAreaWithMemoize = memoize(getArea); console.log(getAreaWithMemoize(2)); // 只在第一次运行的时候打印了 r console.log(getAreaWithMemoize(2)); console.log(getAreaWithMemoize(2));
-
可测试
-
可并行处理
- 多线程环境下并行操作共享内存中的数据(线程不安全),可能会得到意外的结果,即副作用
- 纯函数是无状态函数,不依赖外部数据,因此在并行下可以任意执行纯函数
副作用
纯函数是无状态函数,相同的输入始终得到相同的输出;如果函数依赖外部数据,则无法保证有相同的输出,就产生了副作用。
- 外部数据包括:
- 数据库
- 用户输入
- 配置文件