【问题标题】:creating/appending html elements (browser memory)创建/附加 html 元素(浏览器内存)
【发布时间】:2016-02-13 00:45:15
【问题描述】:

当我将appendChild() 转换为dom[0] 时,您会认为它移动了dom[1]dom[2],但实际上它复制/复制了dom[0] 下的元素,因为它们仍然是实际dom 数组的元素.

//JS

var dom = [];
var element = new Array("div","p","h1");
for(var i=0; i < element.length; i++){
    dom.push(document.createElement(element[i]))
}
dom[0].appendChild(dom[1]);
dom[0].appendChild(dom[2]);
console.log(dom); //div,p,h1
console.log(dom[0].children);//p,h1
console.log(dom.length); //3

问题:如果有的话,元素是否会从内存中删除?

【问题讨论】:

  • 没有复制....数组包含对dom对象的引用
  • 可以使用数组方法.shift()将对象移动到数组的首位。
  • 当无法从任何变量或 DOM 元素中访问对象时,垃圾收集器会将其从内存中删除。

标签: javascript html dom memory


【解决方案1】:

您的问题源于一个非常错误的假设:

数组dom 并不反映实际的DOM 结构。

您正在创建三个元素,并且您将 reference 分配给您的数组中的这些元素。

您还为DOM 本身中的那些元素分配了一个引用

因此,每个元素最终都有两个指向它的引用——dom 数组和 DOM 本身。

引用完全独立于元素本身。您可以创建六个局部变量,它们都指向相同的元素。

元素将在以下情况下被释放:

  • 没有任何东西仍然指向它们
    • 包括dom
    • 还有DOM
    • 和任何局部变量
  • 垃圾收集器运行。

【讨论】:

  • 好吧,这很有意义。我知道 dom 数组不是实际的 DOM,但仍然不明白它们何时被删除...为了澄清,如果我不删除像你提到的 dom 数组,它们将保留在内存中?
  • 正确,如果您将值保留在dom 数组中,它们将不会在页面的生命周期中被释放。这是 JavaScript 中内存泄漏的常见原因。 (ES6 支持一个名为 WeakMaps 的新特性,这种特性可以保持一个值。如果它们是唯一保持引用的东西,它们就会放手。)
  • 太棒了,你就是这个人!是的,我会更多地阅读 WeakMaps,几个月前我读过一些关于它们的信息。感谢您的帮助!
猜你喜欢
  • 2011-08-03
  • 2017-11-15
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多