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