对于javaScript闭包,立即执行函数的用法的一些理解
最近在刷freeCodeCamp上面的題目,發現了這么一道有趣的題目,加深了我對于js中閉包和立即執行表達式的一些理解,題目如下:
給一個正整數num,返回小于或等于num的斐波納契奇數之和。
斐波納契數列中的前幾個數字是 1、1、2、3、5 和 8,隨后的每一個數字都是前兩個數字之和。
例如,sumFibs(4)應該返回 5,因為斐波納契數列中所有小于4的奇數是 1、1、3。
提示:此題不能用遞歸來實現斐波納契數列。因為當num較大時,內存會溢出,推薦用數組來實現。
第一眼看到這個題目,我就對于他的提示產生了疑惑,為什么不可以用遞歸,用數組是怎么一回事?看了看他的推薦的資料,我才理解了提示的含義,以下是參考的資料:
1、遞歸
function Fib(n) {?
??? return n < 2 ? n : (Fib(n - 1) + Fib(n - 2));?
}
2、數組緩存
var IterMemoFib = function() {?
??? var cache = [1, 1];?
??? return function (n) {?
??????? if (n >= cache.length) {?
??????????? for (var i = cache.length; i < n ; i++ ) {?
??????????????? cache[i] = cache[i - 2] + cache[i - 1];?
??????????? }?
??????? }?
??????? return cache[n - 1];?
??? }?
}();
3、直接使用加法
function fib(n) {?
??? if (n < 2) {?
??????? return 1;?
??? }?
??? var a = 1, b = 1;?
??? for (var i = 2; i < n - 1 ;i++ ) {?
??????? b = a + b;?
??????? a = b - a;?
??? }?
??? return a + b;?
}
對比:
如果只使用一次運算,第三種方法速度最快;
如果多次使用,第二種方法明顯優于其它兩種;
在n較大的情況下不推薦使用第一種;n為10*10000的時候遞歸就已經報內存溢出了
參考的博客地址:http://www.cnblogs.com/meteoric_cry/archive/2010/11/29/1891241.html
?以上三種方法都可以用來計算斐波納契數列,第一種采用的是遞歸的方法,第二種采用的是數組緩存的技巧,而第三種方法則最為直接的采用一步一步的加法。
但是第二種方法有著其他兩種方法都難以超越的優勢,即如果要多次使用的話,第二種方法會把之前運算過的結果緩存到cache數組當中,從而大大減少運算量,而且每次運算,第一和第三中方法都要從頭開始運算,而第二種方法會先判斷結果是否已經計算過了,并且不會從頭開始計算,而是從尾部開始計算,而這便運用到了js中的閉包和立即執行函數的功能了。
?
等等,為什么在代碼外邊套了一個function() {//code here......}();呢?這是干嘛的呢?,其實完全可以這么寫:
1 var cache = [1, 1]; 2 function IterMemoFib(n) { 3 if (n >= cache.length) { 4 for (var i = cache.length; i < n; i++) { 5 cache[i] = cache[i - 2] + cache[i - 1]; 6 } 7 } 8 return cache[n - 1]; 9 }?
事實證明上述代碼也是可以實現的,那么兩種方法的區別在于什么地方呢?仔細比較兩種方法可以發現,第一種方法只產生了一個全局變量IterMemoFib;然而第二種方法卻產生了兩個全局變量IterMemoFib和cache,這就是的第一種方法的優點所在。
以上就是我從這道題目中學到的關于閉包和立即執行函數的知識了,下面將這道題目的完整代碼貼出供參考:
1 var sumFibs = function () { 2 var cache = [1, 1]; 3 return function (num) { 4 if (num > cache[cache.length - 1]) { 5 var i = cache.length; 6 while (cache[i - 1] < num) { 7 cache[i] = cache[i - 2] + cache[i - 1]; 8 i++; 9 } 10 } 11 var oddArr = cache.filter(function (value, index, arr) { 12 if (value % 2 === 1 && value <= num) { 13 return true; 14 } 15 }); 16 return oddArr.reduce(function (a, b) { 17 return (a + b); 18 }) 19 } 20 }();?
由于本人水平有限,以上代碼僅供參考。
?
轉載于:https://www.cnblogs.com/txwslyf/p/6807846.html
總結
以上是生活随笔為你收集整理的对于javaScript闭包,立即执行函数的用法的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZXing二维码和条形码
- 下一篇: 全球行政区域接口