成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

學(xué)習(xí)JavaScript之內(nèi)存泄漏

nodejh / 386人閱讀

摘要:接上回我寫了一篇關(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

相關(guān)文章

  • 【進(jìn)階1-5期】JavaScript深入4類常見(jiàn)內(nèi)存泄漏及如何避免

    摘要:本期推薦文章類內(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)階的第一期,本周的主題...

    red_bricks 評(píng)論0 收藏0
  • Deep in JS - 收藏集 - 掘金

    摘要:今天同學(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)典面...

    enali 評(píng)論0 收藏0
  • 2017 前端面試準(zhǔ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)題集錦 - 前端 - 掘金 從原博客遷移...

    王晗 評(píng)論0 收藏0
  • 2017 前端面試準(zhǔ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)題集錦 - 前端 - 掘金 從原博客遷移...

    xiaochao 評(píng)論0 收藏0
  • 2017 前端面試準(zhǔ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)...

    KitorinZero 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<