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

2021-09-18 15:59 更新

內(nèi)存泄露在js變成中幾乎是一個無法避免的問題。如果不是特別細心的話,在最后的檢查過程中,肯定會出現(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); 

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

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號