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