本篇内容主要讲解“JS中factorial函数进化的三个步骤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS中factorial函数进化的三个步骤”吧!
成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计制作、成都网站制作、抚州网络推广、小程序定制开发、抚州网络营销、抚州企业策划、抚州品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供抚州建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
用 memozation实现一段factorial
> 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这个函数进化的三个步骤。
到此,相信大家对“JS中factorial函数进化的三个步骤”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!