概念
- 相同的输入总能得到相同的输出,而且没有任何可观察的副作用
- lodash是一个纯函数的功能库,提供了对数组,数字,对象,字符串,函数等操作的一些方法
- 数组中的slice和splice分别是纯函数和不纯的函数
-
slice返回数组中的指定部分,不会改变原数组
-
对数组进行操作返回该数组,会改变原数组
// 纯函数和不纯的函数
// slice / splice
let array = [1, 2, 3, 4, 5]
// 纯函数 得到相同的输出
console.log(array.slice(0, 3))
console.log(array.slice(0, 3))
console.log(array.slice(0, 3))
// 不纯的函数 得到不相同的输出
console.log(array.splice(0, 3))
console.log(array.splice(0, 3))
console.log(array.splice(0, 3))
// 纯函数
function getSum (n1, n2) {
return n1 + n2
}
console.log(getSum(1, 2))
console.log(getSum(1, 2))
console.log(getSum(1, 2))
纯函数的好处
可缓存
相同的输入总会得到相同的输出,所以可以把纯函数的结果缓存起来
// 记忆函数 lodash函数库缓存
const _ = require('lodash')
function getArea (r) {
console.log(r)
return Math.PI * r * r
}
let getAreaWithMemory = _.memoize(getArea)
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(4))
// 模拟 memoize 方法的实现
function memoize (f) {
let cache = {}
return function () {
let key = JSON.stringify(arguments)
cache[key] = cache[key] || f.apply(f, arguments)
return cache[key]
}
}
let getAreaWithMemory = memoize(getArea)
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(4))
可测试
相同的输入得到相同的输出,测试更方便
并行处理
纯函数不需要访问共享的内存数据,所以可以在任何并行环境中运行任意纯函数