摘要:接上回我寫了一篇關于閉包的博客學習之閉包,最后談到閉包導致的問題時留了一個尾在以下的瀏覽器中會有內存泄漏的問題。今天的博客就繼續探索一下內存泄漏的問題。博客地址的前端之路原文鏈接學習之內存泄漏
接上回我寫了一篇關于閉包的博客《學習JavaScript之閉包》, 最后談到閉包導致的問題時留了一個尾:
在IE9以下的瀏覽器中會有內存泄漏的問題。
今天的博客就繼續探索一下內存泄漏的問題。
淺談JavaScript垃圾回收機制1.標記清除
一開始垃圾收集器會給內存中的所有變量做一個標記,之后當程序運行進入相應的環境時,會去掉環境中的變量和被環境中變量引用的變量標記;當退出該環境后,無法再被訪問的變量又重新被標記,這些被重新標記的變量就會被垃圾收集器回收。
2.引用計數
記錄每個值被引用的次數,當被引用次數為0時該值才會被回收。如果某個值被其他對象引用(賦給某個變量),引用次數+1;如果不再被引用則-1。
閉包導致的內存泄漏怎么產生的在IE9以前的瀏覽器中,DOM對象的垃圾回收機制就是使用引用計數(雖然JS引擎是用標記清除),因此一旦產生循環引用(比如下面這個例子)內存就會一直被占用而無法回收。
function a () { var div = document.getElementById("myTitle") div.onclick = function () { alert(div.id) } }
這段代碼中變量div中保存了一個HTML元素對象,又創建了一個事件處理程序,其中還直接引用了div.id形成了循環引用,而且這個匿名函數只要存在就能利用閉包的特性訪問到div,因此這個HTML元素的引用至少是1。
如何解決內存泄漏的問題首先要解除循環引用:把div.id賦值給一個變量,然后在匿名函數中引用該變量,因為變量只包含值而不存在對div直接引用,所以解除了循環引用。但是,由于閉包的特性使得其仍保存著a函數的活動對象(等于間接地在引用HTML元素),因此還需要手動解除div對HTML元素的引用。用代碼寫出來就是:
function a () { var div = document.getElementById("myTitle") var id = div.id // 解除循環引用 div.onclick = function () { alert(id) } div = null // 手動解除閉包對外部函數活動對象的引用 }
這樣DOM對象的引用就變成了0,也就會被正常地回收了。
博客地址:lbj的前端之路
原文鏈接:學習JavaScript之內存泄漏
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83618.html
摘要:本期推薦文章類內存泄漏及如何避免,由于微信不能訪問外鏈,點擊閱讀原文就可以啦。四種常見的內存泄漏劃重點這是個考點意外的全局變量未定義的變量會在全局對象創建一個新變量,如下。因為老版本的是無法檢測節點與代碼之間的循環引用,會導致內存泄漏。 (關注福利,關注本公眾號回復[資料]領取優質前端視頻,包括Vue、React、Node源碼和實戰、面試指導) 本周正式開始前端進階的第一期,本周的主題...
摘要:今天同學去面試,做了兩道面試題全部做錯了,發過來給道典型的面試題前端掘金在界中,開發人員的需求量一直居高不下。 排序算法 -- JavaScript 標準參考教程(alpha) - 前端 - 掘金來自《JavaScript 標準參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實現 選擇排序 簡介 算法實現 ... 圖例詳解那道 setTimeout 與循環閉包的經典面...
摘要:最近遇到的前端面試題更新版前端掘金個人博客已上線,歡迎前去訪問評論無媛無故的個人博客以下內容非本人原創,是整理后覺得更容易理解的版本,歡迎補充。 一道面試題引發的對 javascript 類型轉換的思考 - 前端 - 掘金 最近群里有人發了下面這題:實現一個函數,運算結果可以滿足如下預期結果: ... 收集 JavaScript 各種疑難雜癥的問題集錦 - 前端 - 掘金 從原博客遷移...
摘要:最近遇到的前端面試題更新版前端掘金個人博客已上線,歡迎前去訪問評論無媛無故的個人博客以下內容非本人原創,是整理后覺得更容易理解的版本,歡迎補充。 一道面試題引發的對 javascript 類型轉換的思考 - 前端 - 掘金 最近群里有人發了下面這題:實現一個函數,運算結果可以滿足如下預期結果: ... 收集 JavaScript 各種疑難雜癥的問題集錦 - 前端 - 掘金 從原博客遷移...
摘要:最近遇到的前端面試題更新版前端掘金個人博客已上線,歡迎前去訪問評論無媛無故的個人博客以下內容非本人原創,是整理后覺得更容易理解的版本,歡迎補充。 一道面試題引發的對 javascript 類型轉換的思考 - 前端 - 掘金最近群里有人發了下面這題:實現一個函數,運算結果可以滿足如下預期結果: ... 收集 JavaScript 各種疑難雜癥的問題集錦 - 前端 - 掘金從原博客遷移過來...
閱讀 2648·2021-11-11 16:55
閱讀 1283·2021-09-22 15:25
閱讀 1802·2019-08-29 16:26
閱讀 974·2019-08-29 13:21
閱讀 2311·2019-08-23 16:19
閱讀 2801·2019-08-23 15:10
閱讀 768·2019-08-23 14:24
閱讀 1855·2019-08-23 13:48