日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对于javaScript闭包,立即执行函数的用法的一些理解

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对于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中的閉包和立即執行函數的功能了。

1 var IterMemoFib = function () { 2 var cache = [1, 1]; 3 4 //下面返回的函數就是一個閉包,其中引用了上一層函數的局部變量cache,這會使的作為局部變量的cache數組常駐內存 5 return function (n) { 6 7 if (n >= cache.length) { 8 for (var i = cache.length; i < n; i++) { 9 cache[i] = cache[i - 2] + cache[i - 1]; 10 } 11 } 12 return cache[n - 1]; 13 } 14 }();

?

等等,為什么在代碼外邊套了一個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闭包,立即执行函数的用法的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。