偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

幫你精通JS:一段函數(shù)的進(jìn)化史

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

[[391818]]

一、首先寫一段求階乘的函數(shù)

用 memozation實(shí)現(xiàn)一段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 只用于函數(shù) factorial 之內(nèi),卻過分暴露于外。按照 least exposure(POLE) 將其隱藏起來。直覺方法就是直接將其放入其中。

二、初步解決接口過分暴露的問題

重新定義最外層coverTheCache函數(shù)將其包裹起來。

  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. ... } 

運(yùn)行測試:

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

此解決方案完全符合直覺,就是單單的將步驟一中的factorial函數(shù)與變量cache收納到另外一個(gè)函數(shù)coverTheCache的肚子里,包裹了一層環(huán)境。

缺憾之處在于,`let factorial2 = hideTheCache();`此處還要另行調(diào)用。因此,接下來將重新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. ... })(); // 關(guān)鍵步驟 
  14. undefined 
  15. > factorial3(11) 
  16. 39916800 
  17. > factorial(300) 
  18. Infinity 
  19. > factorial(30) 
  20. 2.6525285981219103e+32 

如此就不必再另行一步調(diào)用,該方法稱之為 IIFE(

Immediately-Invoked-Function-Expression):

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

四、總結(jié)

我們以memorization的方式求factorial而遭遇over-exposure的問題,由此引出

priciple-of-lease-exposure的原則。

作為解決方案,直覺的做法是將其包裹在外層函數(shù)之內(nèi),不足之處在于需要重新declare函數(shù)。進(jìn)一步解決問題,省略掉重新declare與assignment,用IIFE,在定義的同時(shí)也實(shí)現(xiàn)定義。

以上就是factorial這個(gè)函數(shù)進(jìn)化的三個(gè)步驟。

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2011-12-21 16:44:00

信息圖手機(jī)進(jìn)化史

2014-09-01 16:29:34

2018-08-22 17:58:01

數(shù)據(jù)平臺數(shù)據(jù)倉庫架構(gòu)

2010-07-27 14:04:52

2011-11-03 15:25:07

Android

2011-11-29 09:54:20

Google進(jìn)化史

2011-09-01 09:34:21

架構(gòu)

2023-04-13 13:25:40

ChatGPTGPT神經(jīng)網(wǎng)絡(luò)

2010-10-09 14:46:20

2018-03-23 12:20:25

數(shù)據(jù)中心網(wǎng)絡(luò)數(shù)據(jù)

2024-09-21 10:43:15

數(shù)據(jù)技術(shù)信息

2013-06-24 09:18:05

2010-04-07 14:54:20

Unix操作系統(tǒng)

2023-11-27 09:23:19

2022-03-25 14:01:20

元宇宙虛擬世界進(jìn)化

2016-02-04 09:17:59

2010-01-21 16:08:26

C++語言

2022-03-29 09:35:15

FirefoxUI瀏覽器

2019-06-19 15:54:12

Redis緩存內(nèi)存

2014-08-13 10:31:26

Windows操作系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號