成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

幫你精通JS:一段函數的進化史

開發 前端
我們以memorization的方式求factorial而遭遇over-exposure的問題,由此引出priciple-of-lease-exposure的原則。作為解決方案,直覺的做法是將其包裹在外層函數之內,不足之處在于需要重新declare函數。進一步解決問題,省略掉重新declare與assignment,用IIFE,在定義的同時也實現定義。

[[391818]]

一、首先寫一段求階乘的函數

用 memozation實現一段factorial

  1. > var cache = {}; 
  2. function factorial(x) { 
  3. ...     if (x < 2) return 1; 
  4. ...     if (!(x in cache)) { 
  5. .....         cache[x] = x * factorial(x - 1); 
  6. .....     } 
  7. ...     return cache[x]; 
  8. ... } 
  9. > factorial(8) 
  10. 40320 
  11. > cache 
  12. '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這個函數進化的三個步驟。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2014-09-01 16:29:34

2011-12-21 16:44:00

信息圖手機進化史

2010-10-09 14:46:20

2024-09-21 10:43:15

數據技術信息

2018-03-23 12:20:25

數據中心網絡數據

2023-04-13 13:25:40

ChatGPTGPT神經網絡

2018-08-22 17:58:01

數據平臺數據倉庫架構

2011-09-01 09:34:21

架構

2010-07-27 14:04:52

2011-11-03 15:25:07

Android

2011-11-29 09:54:20

Google進化史

2016-02-04 09:17:59

2023-11-27 09:23:19

2022-03-25 14:01:20

元宇宙虛擬世界進化

2010-01-21 16:08:26

C++語言

2013-06-24 09:18:05

2010-04-07 14:54:20

Unix操作系統

2018-08-23 09:33:12

2019-08-29 08:13:28

2022-03-29 09:35:15

FirefoxUI瀏覽器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 可以在线观看av的网站 | a毛片视频网站 | 精品一区在线 | 亚洲国产视频一区二区 | 91在线看 | a欧美| 成人午夜在线 | 欧美日韩精品一区 | 国产精品96久久久久久 | 国产精品日女人 | 国产精品免费小视频 | 日本久久精品视频 | 免费观看黄色一级片 | av黄色免费在线观看 | 成人在线看片 | 日韩一级二级片 | 亚洲精品国产电影 | 在线观看日本网站 | 成人一级毛片 | 日韩欧美专区 | 91精品在线播放 | 亚洲欧美视频一区 | 久久99精品久久久久 | 不卡一区二区三区四区 | 亚洲精品视频在线观看视频 | 伊伊综合网 | av高清毛片| 久久久xx| 日韩av.com| 91文字幕巨乱亚洲香蕉 | 91麻豆精品国产91久久久久久 | 日韩欧美不卡 | 国产一区91精品张津瑜 | 在线a视频 | 亚洲乱码国产乱码精品精的特点 | 成人精品一区 | 成人精品久久日伦片大全免费 | 日日想夜夜操 | 欧美精品一区二区三区在线 | 波波电影院一区二区三区 | 久久av一区 |