日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
幫你精通JS:一段函數(shù)的進(jìn)化史

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

用 memozation實現(xiàn)一段factorial

創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元泗洪做網(wǎng)站,已為上家服務(wù),為泗洪各地企業(yè)和個人服務(wù),聯(lián)系電話: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 只用于函數(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. ... }

運行測試:

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

此解決方案完全符合直覺,就是單單的將步驟一中的factorial函數(shù)與變量cache收納到另外一個函數(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,在定義的同時也實現(xiàn)定義。

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


分享文章:幫你精通JS:一段函數(shù)的進(jìn)化史
本文來源:http://m.5511xx.com/article/dpoeseh.html