摘要:眾所周知,閉包的一個作用就是讓一些變量始終保持在內存中,在此我用一些實際代碼對這句話作進一步的理解。輸出這個很好理解,不多說輸出輸出上述代碼中,就是執行函數返回的匿名函數。
閉包是javascript中繞不開的話題,關于閉包的一些概念和應用,這方面資料比較多,在此就不再贅述。眾所周知,閉包的一個作用就是 讓一些變量始終保持在內存中 ,在此我用一些實際代碼對這句話作進一步的理解。
demo1: function closure(){ var n = 0; function test() { console.log(++n); } test() test() } closure(); //輸出1,2(這個很好理解,不多說)
demo2: function test(){ var i=0; return function(){ console.log(i++); } } var fn = test(); fn(); //輸出0 fn(); //輸出1
上述代碼中,fn就是執行函數test()返回的匿名函數。由于fn又是一個全局變量,生命周期一直存在,且這個匿名函數引用了父函數test里面的一個局部變量,所以變量i的狀態會被一直保存.
demo3: function test(){ var i=0; return function(){ console.log(i++); } } test()(); //輸出0 test()(); //輸出0
上述代碼中,執行test()返回的是其內部的匿名函數,但是執行完test()()以后,該匿名函數的生命周期已經結束,所以變量i的狀態沒有得到保存。
最近在簡書上讀到一篇有趣的文章,其中一些代碼如下:
for (var i = 0; i < 5; i++) { setTimeout((function(i) { console.log(i); })(i), i * 1000); } //輸出0,1,2,3,4
上述代碼中有一個setTimeout()函數,其使用格式為setTimeout(func,time),意思是至少過time時間后,執行func。有了這樣的認識后,我們可以把func等價成:
(function(i){console.log(i)})(i)這個自執行函數。所以這個事情分兩步,首先每次循環自執行函數肯定會立即執行一次,會依次輸出1,2,3,4。其次,每過time時間,執行一次func,但是在上述代碼中,func等價于一個立即執行函數,沒有返回值,故什么也不會做。
如果把上述代碼改成這樣:
for (var i = 0; i < 5; i++) { var j=7; setTimeout((function(i) { console.log(i); return function(){ console.info(j++); } })(i), i * 1000); }
上述代碼會依次輸出0,1,2,3,4, 7,8,9,10,11(結合這個例子理解上一個問題,就容易多了)
如果把上面的代碼改成這樣呢?
for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, i * 1000); }
運行上面的代碼會輸出5個5(這一點現在可以理解了吧),有人不解的是為什么是每隔一秒輸出5而不是隔五秒輸出5。setTimeout(func,time)這個函數延遲執行的只是func里面的動作,而time的值是不存在延遲的。上面執行for循環,相當于:setTimeout(func,1000),setTimeout(func,2000) .... 第一次setTimeout執行的時候等了一秒(準確地說,至少要等一秒),第二次setTimeout執行的時候等2秒,但是前面第一次執行的setTimeout函數時,已經等了一秒,所以只需再等一秒就可以立即執行了。在這里,需要弄明白的是,setTimeout函數延遲執行的時間,起點是從time開始賦值的時候計算的,不是從上一個setTimeout函數執行完開始算的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81897.html
摘要:也許最好的理解是閉包總是在進入某個函數的時候被創建,而局部變量是被加入到這個閉包中。在函數內部的函數的內部聲明函數是可以的可以獲得不止一個層級的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請自行忽略。 譯者 :文章寫在2006年,可直到翻譯的21小時之前作者還在完善這篇文章,在Stackoverflow的How do Java...
摘要:說了半天,究竟什么是閉包呢閉包就是函數的局部變量集合,只是這些局部變量在函數返回后會繼續存在。彈出上面函數中的函數就是閉包,就是通過建立函數來訪問函數內部的局部變量。閉包會在父函數外部,改變父函數內部變量的值。 JavaScript的閉包 首先聲明,這是一篇面向小白的博客,不過也歡迎各位大牛批評指正,謝謝。 ??其實關于閉包各個論壇社區里都有很多的文章來講它,畢竟閉包是JavaScri...
摘要:說了半天,究竟什么是閉包呢閉包就是函數的局部變量集合,只是這些局部變量在函數返回后會繼續存在。彈出上面函數中的函數就是閉包,就是通過建立函數來訪問函數內部的局部變量。閉包會在父函數外部,改變父函數內部變量的值。 JavaScript的閉包 首先聲明,這是一篇面向小白的博客,不過也歡迎各位大牛批評指正,謝謝。 ??其實關于閉包各個論壇社區里都有很多的文章來講它,畢竟閉包是JavaScri...
摘要:當在中調用匿名函數時,它們用的都是同一個閉包,而且在這個閉包中使用了和的當前值的值為因為循環已經結束,的值為。最好將閉包當作是一個函數的入口創建的,而局部變量是被添加進這個閉包的。 閉包不是魔法 這篇文章使用一些簡單的代碼例子來解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實只要理解了核心概念,閉包并不是那么的難于理解。但是,網上充斥了太多學術性的文章,對于...
摘要:閉包在我理解是一種比較抽象的東西。所以我寫了一篇博文來方便自己理解閉包。那么現在我們可以解釋一下閉包的第一個定義在計算機科學中,閉包是引用了自由變量的函數。循環中創建閉包在我們使用的關鍵字之前,閉包的一個常見問題就出現在循環中創建閉包。 零. 前言 從我開始接觸前端時就聽說過閉包,但是一直不理解閉包究竟是什么。上網看了各種博客,大家對閉包的說法不一。閉包在我理解是一種比較抽象的東西。所...
摘要:閉包引起的內存泄漏總結從理論的角度將由于作用域鏈的特性中所有函數都是閉包但是從應用的角度來說只有當函數以返回值返回或者當函數以參數形式使用或者當函數中自由變量在函數外被引用時才能成為明確意義上的閉包。 文章同步到github js的閉包概念幾乎是任何面試官都會問的問題,最近把閉包這塊的概念梳理了一下,記錄成以下文章。 什么是閉包 我先列出一些官方及經典書籍等書中給出的概念,這些概念雖然...
閱讀 1739·2021-09-26 09:46
閱讀 3017·2021-09-22 15:55
閱讀 2608·2019-08-30 14:17
閱讀 3027·2019-08-26 11:59
閱讀 1809·2019-08-26 11:35
閱讀 3155·2019-08-26 10:45
閱讀 3152·2019-08-23 18:28
閱讀 1106·2019-08-23 18:21