1.首先写一个函数求factorial,用memozation实现一个factorial>varcache={};>>functionfactorial(x){...if(x<2)return1;...if(!(xincache)){.....cache[x]=x*factorial(x-1);.....}...returncache[x];...}>factorial(8)40320>缓存{'2':2,'3':6,'4':24,'5':120,'6':720,'7':5040,'8':40320}这里缓存只用在factorial函数里面,但是暴露在外面太多了。通过最少曝光(POLE)隐藏它。直观的方法是将它放在那里。2、初步解决接口暴露过多问题重新定义最外层的coverTheCache函数将其包裹起来。>functioncoverTheCache(){...//"middlescope",wherewecover`cache`...varcache={};...returnfactorial;...//************************...functionfactorial(x){...//innerscope...if(x<2)return1;...if(!(xincache)){.....cache[x]=x*factorial(x-1);.....}...returncache[x];...}...}运行测试:>letfactorial2=coverTheCache();>factorial2(9)362880>factorial(10)3628800这个方案完全符合直觉,就是简单的把步骤1中的阶乘函数和变量缓存存放到另一个函数coverTheCache的胃里,用一层环境包裹起来。缺点是这里需要单独调用`letfactorial2=hideTheCache();`。因此,接下来将去掉重新声明和赋值的步骤。3、IIFE解决过曝问题>constfactorial3=(functioncoverTheCache(){...varcache={};...functionfactorial(x){...if(x<2)return1;...if(!(xincache)){.....cache[x]=x*factorial(x-1);.....}...returncache[x];...}...returnfactorial;.....Invoked-Function-Expression)://outerscope(function(){//innerhiddenscope})();//moreouterscope4.总结一下我们在记忆的方式求阶乘的时候出现过曝的问题,导致原理租赁暴露原则。作为解决方案,直观的方法是将其包装在外部函数中。缺点是需要重新声明declare函数。为了进一步解决问题,省略了重新声明和赋值,在定义的时候使用IIFE来实现定义。以上就是阶乘函数演化的三个步骤。
