8

根据mdn 文档,该方法removeChild从 DOM 中删除了一个节点,但它仍然驻留在内存中。我的问题是我也想从内存中删除它。我已经尝试过delete操作员,但对象仍然存在......

myCanvas.parentElement.removeChild(myCanvas);  // myCanvas actually removed from DOM
delete myCanvas;  // false. does nothing
alert(myCanvas); // shows HTMLCanvasElement instead of undefined
4

4 回答 4

10

阅读http://perfectkills.com/understanding-delete/。delete 运算符不适用于变量(这就是它返回的原因false)。

如果要删除变量对 DOM 节点的引用,请使用

myCanvas = null;

覆盖该值。通常你永远不需要这样做,因为 JS 的垃圾收集器会为你完成所有的工作。

于 2012-08-01T12:21:09.730 回答
3

只需为myCanvas变量(如null)分配另一个值,以便不再有变量引用画布元素。垃圾收集将完成其余的工作。

当然,不能保证。这假设也没有其他变量引用该元素。否则,如果还有其他变量、对象等仍然引用该画布元素,那么它根本不会从内存中删除。如果存在包含对元素的引用但无法取消引用的闭包,这将更难删除。

于 2012-08-01T12:16:49.370 回答
0

好吧,如果您在没有关键字的情况下初始化myCanvas变量,您的代码片段可能会起作用,因为这些变量会自动生成,因此可以使用操作员轻松处理。varconfigurable: truedelete

否则,您可以使用getElementsByClassName()方法之外的对象引用而不是个人HTMLElement 本身

-- 我在这里假设这myCanvasgetElementById()操作等的结果 --

因为 一旦从树中删除,HTMLCollection由 生成的将更新自身并删除对有问题的 DOM 对象的任何引用。getElementsByClassName()

换句话说,它是天生的,因此它不需要任何手动操作来破坏/清除引用。

于 2014-12-25T16:40:30.277 回答
0

基本答案是所有引用画布的变量都需要设置为,undefined以便垃圾收集器可以完成其工作。但有时在实践中并不是那么简单。

以下是我在尝试完全删除动态创建的 HTML 画布元素以避免内存泄漏时遇到的几种棘手情况:

(1) 我添加到 canvas 元素的方法拥有自己的引用(创建一个循环)。我通过在删除画布时删除所有自定义属性来解决此问题:

function deleteAllProperties(obj) {
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            delete obj[key];
        }
    }
}
deleteAllProperties(myCanvas);
myCanvas = undefined;

(2) 其他对象中的内部变量仍然引用画布。通过将它们全部设置为来修复undefined

_myVar = myBuilder = myObserver = undefined;

(3) 引用画布上下文的变量:var ctx = myCanvas.getContext('2d');这在某些浏览器中保留在画布上(即使在设置之后myCanvas = undefined)。通过清除该变量来修复:

ctx = undefined;
于 2019-04-16T23:46:43.613 回答