內(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...
更多建議: