如果我做类似的事情
// global scope
function stuff() {
// local scope
var a = new SomeHugeMemoryHog();
}
// a doesn't exist down here, but what happened to the memory from the "stuff" scope?
如果我不在 stuff
范围的末尾设置 a = null
是否会造成内存泄漏?或者我不应该担心吗?我问这个问题的重点是在函数范围内创建 DOM
对象(例如 canvas
)(我以后不会随时使用)。我只使用 Canvas 来获取矢量维度。
最佳答案
正如其他人指出的那样,由于在函数之外没有对 a
的引用,垃圾收集器将收集它,很可能是在下一次收集时。
但是,您需要注意的是间接捕获。发生这种情况的一个常见地方是通过闭包捕获在事件处理程序中。例如,
function stuff() {
var a = new SomeLargeObject();
$("#somediv").click(function () { /* something */ });
}
即使嵌套函数不使用a
。 a
可能会保持事件状态,因为 stuff
的激活记录仍然存在。此外,DOM 对象的收集方式可能与普通的 JavaScript 对象不同,这可能导致它们易受循环引用的影响,从而导致收集问题。这在旧版浏览器中是最有问题的,因为您引用使用 Canvas ,所以支持 Canvas 的浏览器往往更现代,可以正确处理循环引用,并允许收集未被闭包捕获的局部变量。
关于javascript - 范围内的内存机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8379832/