您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“JS中factorial函數(shù)進化的三個步驟”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“JS中factorial函數(shù)進化的三個步驟”吧!
用 memozation實現(xiàn)一段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 只用于函數(shù) factorial 之內(nèi),卻過分暴露于外。按照 least exposure(POLE) 將其隱藏起來。直覺方法就是直接將其放入其中。
重新定義最外層coverTheCache函數(shù)將其包裹起來。
> 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函數(shù)與變量cache收納到另外一個函數(shù)coverTheCache的肚子里,包裹了一層環(huán)境。
缺憾之處在于,`let factorial2 = hideTheCache();`此處還要另行調(diào)用。因此,接下來將重新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; ... })(); // 關(guān)鍵步驟 undefined > factorial3(11) 39916800 > factorial(300) Infinity > factorial(30) 2.6525285981219103e+32
如此就不必再另行一步調(diào)用,該方法稱之為 IIFE(
Immediately-Invoked-Function-Expression):
// outer scope (function(){ // inner hidden scope })(); // more outer scope
我們以memorization的方式求factorial而遭遇over-exposure的問題,由此引出
priciple-of-lease-exposure的原則。
作為解決方案,直覺的做法是將其包裹在外層函數(shù)之內(nèi),不足之處在于需要重新declare函數(shù)。進一步解決問題,省略掉重新declare與assignment,用IIFE,在定義的同時也實現(xiàn)定義。
以上就是factorial這個函數(shù)進化的三個步驟。
到此,相信大家對“JS中factorial函數(shù)進化的三個步驟”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。