用 memozation实现一段factorial

创新互联从2013年成立,是专业互联网技术服务公司,拥有项目网站设计制作、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元泗洪做网站,已为上家服务,为泗洪各地企业和个人服务,联系电话:18982081108
- > var cache = {};
 - >
 - > function factorial(x) {
 - ... if (x < 2) return 1;
 - ... if (!(x in cache)) {
 - ..... cache[x] = x * factorial(x - 1);
 - ..... }
 - ... return cache[x];
 - ... }
 - > factorial(8)
 - 40320
 - > cache
 - { '2': 2, '3': 6, '4': 24, '5': 120, '6': 720, '7': 5040, '8': 40320 }
 
此处 cache 只用于函数 factorial 之内,却过分暴露于外。按照 least exposure(POLE) 将其隐藏起来。直觉方法就是直接将其放入其中。
重新定义最外层coverTheCache函数将其包裹起来。
- > function coverTheCache() {
 - ... // "middle scope", where we cover `cache`
 - ... var cache = {};
 - ...
 - ... return factorial;
 - ...
 - ... // **********************
 - ...
 - ... function factorial(x) {
 - ... // inner scope
 - ... if (x < 2) return 1;
 - ... if (!(x in cache)) {
 - ..... cache[x] = x * factorial(x - 1);
 - ..... }
 - ... return cache[x];
 - ... }
 - ... }
 
运行测试:
- > let factorial2 = coverTheCache();
 - > factorial2(9)
 - 362880
 - > factorial(10)
 - 3628800
 
此解决方案完全符合直觉,就是单单的将步骤一中的factorial函数与变量cache收纳到另外一个函数coverTheCache的肚子里,包裹了一层环境。
缺憾之处在于,`let factorial2 = hideTheCache();`此处还要另行调用。因此,接下来将重新declare与赋值的这一步去掉。
- > const factorial3 = (function coverTheCache() {
 - ... var cache = {};
 - ...
 - ... function factorial(x) {
 - ... if (x < 2) return 1;
 - ... if (!(x in cache)) {
 - ..... cache[x] = x * factorial(x - 1);
 - ..... }
 - ... return cache[x];
 - ... }
 - ...
 - ... return factorial;
 - ... })(); // 关键步骤
 - undefined
 - > factorial3(11)
 - 39916800
 - > factorial(300)
 - Infinity
 - > factorial(30)
 - 2.6525285981219103e+32
 
如此就不必再另行一步调用,该方法称之为 IIFE(
Immediately-Invoked-Function-Expression):
- // outer scope
 - (function(){
 - // inner hidden scope
 - })();
 - // more outer scope
 
我们以memorization的方式求factorial而遭遇over-exposure的问题,由此引出
priciple-of-lease-exposure的原则。
作为解决方案,直觉的做法是将其包裹在外层函数之内,不足之处在于需要重新declare函数。进一步解决问题,省略掉重新declare与assignment,用IIFE,在定义的同时也实现定义。
以上就是factorial这个函数进化的三个步骤。