javascript - 范围内的内存机制

标签 javascript memory-management scope

如果我做类似的事情

// 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 */ });
}

即使嵌套函数不使用aa 可能会保持事件状态,因为 stuff 的激活记录仍然存在。此外,DOM 对象的收集方式可能与普通的 JavaScript 对象不同,这可能导致它们易受循环引用的影响,从而导致收集问题。这在旧版浏览器中是最有问题的,因为您引用使用 Canvas ,所以支持 Canvas 的浏览器往往更现代,可以正确处理循环引用,并允许收集未被闭包捕获的局部变量。

关于javascript - 范围内的内存机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8379832/

相关文章:

c - 循环内的堆栈分配

c - 在循环内的动态数组中分配的运行时堆栈大小

ruby - Ruby 中 WeakRef 的成本是多少?

ruby-on-rails - 嵌套 has_many 关系的范围

c++ - 为什么 C++ 参数作用域会影响命名空间内的函数查找?

javascript - 联系表格 7 : display/hide div on selection

javascript - 重新加载es6类

javascript - 即使将元素设置为自动,如何确定元素的 z-index

javascript - Dropbox API - Node.js - 记住身份验证

C++ 在指针范围结束后访问堆上的对象