1 纯函数的运算结果可以缓存,优化性能 ( 因为纯函数对相同的输入始终会产生相同的结果,所以可以缓存纯函数的结果)
const _ = require("loadsh");
// _.memoize(func, [resolver]) 创建一个会缓存 func 结果的函数。
// 求圆形的面积
const getArea = (r) => {
console.log(r);
return Math.PI * r * r;
};
const getAreaUseMomery = _.memoize(getArea);
console.log(getAreaUseMomery(5));
console.log(getAreaUseMomery(5));
console.log(getAreaUseMomery(5));
console.log(getAreaUseMomery(5));
// 5
// 78.53981633974483
// 78.53981633974483
// 78.53981633974483
// 78.53981633974483
// 只打印了一次 5 ,即第一次进行了运算,后面几次是取的缓存的数据
// 手写一个 memoize
const myMemoize = (fn) => {
const obj = {};
return function () {
const keys = JSON.stringify(arguments);
obj[keys] = obj[keys] || fn.apply(fn, arguments);
return obj[keys];
};
};
const getAreaUseMyMomery = myMemoize(getArea);
console.log(getAreaUseMyMomery(5));
console.log(getAreaUseMyMomery(5));
console.log(getAreaUseMyMomery(5));
console.log(getAreaUseMyMomery(5));
// 5
// 78.53981633974483
// 78.53981633974483
// 78.53981633974483
// 78.53981633974483
// myMemoize 通过内部变量 obj来缓存计算结果,缓存标记使用obj的key
2 可测试,让测试更方便 (单元测试 可以断言结果)
3 并行处理
· 在多线程环境下,并行操作共享的内存(全局变量)可能会出现意外情况
· 纯函数不需要访问共享的内存数据,所以在并行环境下,可以任意运行纯函数(web worker)