JavaScript 常見錯(cuò)誤三:內(nèi)存泄露

2021-09-18 15:59 更新

內(nèi)存泄露在js變成中幾乎是一個(gè)無法避免的問題。如果不是特別細(xì)心的話,在最后的檢查過程中,肯定會(huì)出現(xiàn)各種內(nèi)存泄露問題。下面我們就來舉例說明一下:

var theThing = null; 

var replaceThing = function () { 

    var priorThing = theThing; 

    var unused = function () { 

              if (priorThing) {       console.log("hi");     }   

   }; 

   theThing = {     longStr: new Array(1000000).join('*'),  // 

              someMethod: function () {       console.log(someMessage);     }   
   }; 
};   
setInterval(replaceThing, 1000); 

如果運(yùn)行上面的代碼,你會(huì)發(fā)現(xiàn)你已經(jīng)造成了大量的內(nèi)存泄露,每秒泄露1M的內(nèi)存,顯然光靠GC(垃圾回收器)是無法幫助你的了。由上面的代碼來看,似乎是longstr在每次replaceThing調(diào)用的時(shí)候都沒有得到回收。這是為什么呢?

每一個(gè)theThing結(jié)構(gòu)都含有一個(gè)longstr結(jié)構(gòu)列表。每一秒當(dāng)我們調(diào)用 replaceThing, 它就會(huì)把當(dāng)前的指向傳遞給 priorThing. 但是到這里我們也會(huì)看到并沒有什么問題,因?yàn)?priorThing 每回也是先解開上次函數(shù)的指向才會(huì)接受新的賦值。并且所有的這一切都是發(fā)生在 replaceThing 函數(shù)體當(dāng)中,按常理來說當(dāng)函數(shù)體結(jié)束之后,函數(shù)中的本地變量也將會(huì)被GC回收,也就不會(huì)出現(xiàn)內(nèi)存泄露的問題了,但是為什么會(huì)出現(xiàn)上面的錯(cuò)誤呢?

這是因?yàn)閘ongstr的定義是在一個(gè)閉包中進(jìn)行的,而它又被其他的閉包所引用,js規(guī)定,在閉包中引入閉包外部的變量時(shí),當(dāng)閉包結(jié)束時(shí)此對(duì)象無法被垃圾回收(GC)。關(guān)于在JS中的內(nèi)存泄露問題可以查看http://javascript.info/tutorial/memory-leaks#memory-management-in-java...

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)