摘要:在試圖弄清這個問題之前,先要理解棧內存堆內存和預處理。因此在子函數執行的時候,堆內存被占用了,相應的棧內存也將保留。所以,棧內存在執行完之后會被保留一段時間,這段時間等于其子函數執行的時間。
在試圖弄清這個問題之前,先要理解棧內存、堆內存和預處理。
占用內存,不會銷毀的閉包實例 例1:var num = 12; function fn() { var num = 100; return function () { console.log(num); } } var f = fn(); f();
例1的圖示
未被占用的堆內存才會被銷毀
所以,正如圖中橢圓形關鍵點中說明的那樣,堆內存xxxfff111被返回給了全局變量f,而全局變量只有在窗口關閉的時候才會銷毀,因此堆內存xxxfff111將一直被占用而不會銷毀,定義它的局部作用域A也不會被銷毀。
例2var oDiv = document.getElementById("div1"); ~function() { oDiv.onclick = function() { } }();
這段代碼的特點是:私有作用域給DOM元素的事件綁定一個方法。
例2的圖示:
正如圖中橢圓形關鍵點所說,標簽對象的屬性里面會自帶一個onclick的屬性,未被賦值時其值為null。那么,在自執行函數執行的時候,其創建的作用域所占用的堆內存xxxfff111同樣也會被全局的堆內存xxxfff000占用(這里要注意,是堆內存占用堆內存),所以堆內存xxxfff111和棧內存A都不會被銷毀。
不占用內存,立即銷毀的實例只需要將例1稍作修改。
例3:function fn(){ var num = 100; return function(){ console.log(num); } } fn(); //主要修改在這里
例3的圖示
由于在函數fn中,xxxfff111是被return的,所以棧內存A的預解釋不會處理xxxfff111,它只在fn函數執行的時候才會生成,而函數fn的棧內存A每次被執行之后都會被銷毀。
暫時占用內存,延時銷毀的閉包實例將例3稍作修改,就變成了延時銷毀的閉包實例。
例4:function fn(){ var num = 100; return function(){ } } fn()(); //這里到底發生了什么?其實是執行了一次fn之后,把返回的子函數有執行了一次,所以在子函數執行的時候,棧內存fn()是不能銷毀的,但是子函數執行完畢后因為沒有被占用,所以最終fn()還是會被銷毀的。
例4的圖示:
正如圖中橢圓形關鍵點處所說,fn()()的意思是在執行完fn()之后再把返回的值函數執行一遍。因此在子函數執行的時候,堆內存xxxfff111被占用了,相應的棧內存A也將保留。
可堆內存xxxfff111中保存的子函數在執行完成之后還是會被銷毀,接著堆內存xxxfff111就作為未被占用的堆內存而被銷毀,最終棧內存A也會被銷毀。
所以,棧內存在執行完之后會被保留一段時間,這段時間等于其子函數執行的時間。
參考資料:
JavaScript高級程序設計(第三版)。
我在github
https://github.com/zhuanyongx...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107411.html
摘要:中對內存的一些了解在進行開發的過程中了解內存機制有助于開發人員能夠清晰的認識到自己寫的代碼在執行的過程中發生過什么也能夠提高項目的代碼質量內存是怎么樣的中變量存放有著原始值與引用值之分原始值原始的數據類型以及新加入的引用值等類型的值便是引用 JS中對內存的一些了解 在JS進行開發的過程中, 了解JS內存機制有助于開發人員能夠清晰的認識到自己寫的代碼在執行的過程中發生過什么, 也能夠提高...
摘要:中所有的事件綁定都是異步編程當前這件事件沒有徹底完成,不再等待,繼續執行下面的任務當綁定事件后,不需要等待執行,繼續執行下一個循環任務,所以當我們點擊執行方法的時候,循環早已結束即是最后。 概念 閉包就是指有權訪問另一個函數作用域中的變量的函數 點擊li標簽彈出對應數字 0 1...
摘要:對于,其默認大小一般是本地存儲和都保存在瀏覽器端,且都是同源的。把變量放在閉包中和放在全局作用域,對內存的影響是一致的,這里并不能說成是內存泄露。將新的樹和之前的虛擬樹進行相比較,根據結果對進行精準響應。 1. JavaScript 1. JavaScript文件在什么情況下會放在html哪個位置 https://zhuanlan.zhihu.com/p/... 對于必須要在DOM加載...
摘要:對于,其默認大小一般是本地存儲和都保存在瀏覽器端,且都是同源的。把變量放在閉包中和放在全局作用域,對內存的影響是一致的,這里并不能說成是內存泄露。將新的樹和之前的虛擬樹進行相比較,根據結果對進行精準響應。 1. JavaScript 1. JavaScript文件在什么情況下會放在html哪個位置 https://zhuanlan.zhihu.com/p/... 對于必須要在DOM加載...
閱讀 2427·2021-10-11 10:57
閱讀 1277·2021-10-09 09:59
閱讀 1992·2019-08-30 15:53
閱讀 3211·2019-08-30 15:53
閱讀 1007·2019-08-30 15:45
閱讀 736·2019-08-30 15:44
閱讀 3442·2019-08-30 14:24
閱讀 952·2019-08-30 14:21