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