我一直在閱讀了關於JS的最佳做法和常見的錯誤,我碰到這段代碼從https://www.toptal.com/javascript/10-most-common-javascript-mistakes這個js代碼如何泄漏內存?
var theThing = null;
var replaceThing = function() {
var priorThing = theThing; // hold on to the prior thing
var unused = function() {
// 'unused' is the only place where 'priorThing' is referenced,
// but 'unused' never gets invoked
if (priorThing) {
console.log("hi");
}
};
theThing = {
longStr: new Array(1000000).join('*'), // create a 1MB object
someMethod: function() {
console.log(someMessage);
}
};
};
我試着輸入這個代碼到控制檯,並呼籲replaceThing()
多次,真不夠,即使在GC之後,Chrome任務管理器中的內存使用也會增加。
關閉unused
保留對priorThing的引用,從而使其不符合GC的條件。但是:
priorThing = theThing
- ,不會在
unused
關閉參考改變以及對theThing
? - 即使#1不是這樣,當執行
replaceThing
完成時,是否應該不會變量unused
超出範圍?
我試圖尋找在控制檯的功能範圍。我的理解是正確的:當創建Thing中的someMethod閉包時,它保留對未使用的引用,該引用本身保留對priorThing的引用。 priorThing本身包含了以前版本的someMethod,而對於以前版本的未使用,形成了一個引用鏈回到第一個對象? –
耶,正確理解 – henrybbosa
以及它的一個棘手的部分javascript – henrybbosa