帮你精通JS:一段函数的进化史

一、首先写一段求阶乘的函数

用 memozation实现一段factorial

创新互联从2013年成立,是专业互联网技术服务公司,拥有项目网站设计制作、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元泗洪做网站,已为上家服务,为泗洪各地企业和个人服务,联系电话:18982081108

 
 
 
  1. > var cache = {};
  2. >
  3. > function factorial(x) {
  4. ...     if (x < 2) return 1;
  5. ...     if (!(x in cache)) {
  6. .....         cache[x] = x * factorial(x - 1);
  7. .....     }
  8. ...     return cache[x];
  9. ... }
  10. > factorial(8)
  11. 40320
  12. > cache
  13. { '2': 2, '3': 6, '4': 24, '5': 120, '6': 720, '7': 5040, '8': 40320 }

此处 cache 只用于函数 factorial 之内,却过分暴露于外。按照 least exposure(POLE) 将其隐藏起来。直觉方法就是直接将其放入其中。

二、初步解决接口过分暴露的问题

重新定义最外层coverTheCache函数将其包裹起来。

 
 
 
  1. > function coverTheCache() {
  2. ...     // "middle scope", where we cover `cache`
  3. ...     var cache = {};
  4. ...
  5. ...     return factorial;
  6. ...
  7. ...     // **********************
  8. ...
  9. ...     function factorial(x) {
  10. ...         // inner scope
  11. ...         if (x < 2) return 1;
  12. ...         if (!(x in cache)) {
  13. .....             cache[x] = x * factorial(x - 1);
  14. .....         }
  15. ...         return cache[x];
  16. ...     }
  17. ... }

运行测试:

 
 
 
  1. > let factorial2 = coverTheCache();
  2. > factorial2(9)
  3. 362880
  4. > factorial(10)
  5. 3628800

此解决方案完全符合直觉,就是单单的将步骤一中的factorial函数与变量cache收纳到另外一个函数coverTheCache的肚子里,包裹了一层环境。

缺憾之处在于,`let factorial2 = hideTheCache();`此处还要另行调用。因此,接下来将重新declare与赋值的这一步去掉。

三、IIFE解决过分暴露的问题

 
 
 
  1. > const factorial3 = (function coverTheCache() {
  2. ...     var cache = {};
  3. ...
  4. ...     function factorial(x) {
  5. ...         if (x < 2) return 1;
  6. ...         if (!(x in cache)) {
  7. .....             cache[x] = x * factorial(x - 1);
  8. .....         }
  9. ...         return cache[x];
  10. ...     }
  11. ...
  12. ...     return factorial;
  13. ... })(); // 关键步骤
  14. undefined
  15. > factorial3(11)
  16. 39916800
  17. > factorial(300)
  18. Infinity
  19. > factorial(30)
  20. 2.6525285981219103e+32

如此就不必再另行一步调用,该方法称之为 IIFE(

Immediately-Invoked-Function-Expression):

 
 
 
  1. // outer scope
  2. (function(){
  3.     // inner hidden scope
  4. })();
  5. // more outer scope

四、总结

我们以memorization的方式求factorial而遭遇over-exposure的问题,由此引出

priciple-of-lease-exposure的原则。

作为解决方案,直觉的做法是将其包裹在外层函数之内,不足之处在于需要重新declare函数。进一步解决问题,省略掉重新declare与assignment,用IIFE,在定义的同时也实现定义。

以上就是factorial这个函数进化的三个步骤。

标题名称:帮你精通JS:一段函数的进化史
文章转载:http://www.shufengxianlan.com/qtweb/news49/70949.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联