函数式编程中纯函数如何理解?编程
概念: 不依赖执行的上下文,也不影响上下文的变量,输出只由输入决定
代码理解一下缓存
// 综上,非纯函数,输入依赖外部变量 let b = 1 function unPure(a) { return a + b } // 综上,非纯函数,输出改变外部变量 let o = {} function unPure(object) { object.ex = 1 return object } // 综上, 纯函数, 输出输入不影响外部变量 function pure(a) { let b = 1 return a + b }
相信你们发现了,不管是概念仍是代码理解都很简单, 那为何要使用纯函数呢? 下面咱们罗列一下使用纯函数的好处app
纯函数能够根据输入来作缓存函数式编程
// 下面的代码咱们能够发现相同的输入,再第二次调用的时候都是直接取的缓存 let squareNumber = memoize((x) => { return x*x; }); squareNumber(4); //=> 16 squareNumber(4); // 从缓存中读取输入值为 4 的结果 //=> 16 squareNumber(5); //=> 25 squareNumber(5); // 从缓存中读取输入值为 5 的结果 //=> 25
怎么实现呢? 咱们接着看下面的代码函数
const memoize = (f) => { const cache = {}; return () => { var arg_str = JSON.stringify(arguments); // 关键就在这里,咱们利用纯函数相同输入相同输出的逻辑,在这里利用cache作一个简单的缓存,当这个参数以前使用过期,咱们当即返回结果就行 cache[arg_str] = cache[arg_str] || f.apply(f, arguments); return cache[arg_str]; }; };
可移植性大白话过来就是,在任何一个地方均可以随意使用,A项目中使用过的,B项目想要使用直接拿过来就ok的那种学习
代码再来理解一下测试
// 咱们注意看下方有两个注册的函数 // 不纯的, 若是B项目想要用到这个函数,很显然咱们将其依赖的其它服务给搬过去 const signUp = function(attrs) { var user = saveUser(attrs); welcomeUser(user); } // 纯的, 咱们再来看看下面这个纯函数写法,纯函数给了咱们足够多的信息,咱们想在B项目使用其功能只需将单个方法搬过去再给其注入须要的参数便可 const signUp = function(Db, Email, attrs) { return function() { var user = saveUser(Db, attrs); welcomeUser(Email, user); }; };
综上所述,这个就很简单了,咱们不须要关心其它外部的信息,只须要给函数特定的输入,再断言其输出就行了code
JS每日一题能够当作是一个语音答题社区
天天利用碎片时间采用60秒内的语音形式来完成当天的考题
群主在第二天0点推送当天的参考答案cdn
点击加入答题get