javascript - 如何正确取消引用然后删除 JavaScript 对象?

标签 javascript object memory-management garbage-collection dereference

我想知道从内存中完全取消引用 JavaScript 对象的正确方法。确保它被删除时不会在内存中悬空,并且垃圾收集器会删除该对象。

当我看到这个问题时 Deleting Objects in JavaScript .有人解释说,如果你删除对象的所有引用,GC 会将其从内存中删除。我想知道如何从同时具有方法和属性的对象中删除引用。

假设您有一个使用 function 创建的对象,并且该对象同时具有方法和属性。假设它看起来像这样:

function myObject(x, y) {
   this.x = x; 
   this.y = y;

   this.myMethod = function() {
      // method code
   }
}

var myInstance = new myObject(24, 42) // How to remove this completely?

注意:这是一个示例,我知道您可以使用 prototype 作为方法。

我知道我不能只说 delete myInstance。因此,在这种情况下,要完全删除该对象,我需要对其所有属性调用 delete,然后像这样在实例上调用 delete 吗?

delete myInstance.x;
delete myInstance.y;
delete myInstance; // I'm not sure if this is necessary.

这行得通吗?或者我是否还需要删除它的方法(如果是的话如何)?

或者也许有更好更简单的方法来做到这一点?

最佳答案

Javascript 是一种垃圾回收语言。只有当没有其他代码引用它时,它才会清理一个对象。那些其他引用需要超出范围(并且不被闭包持有)或者您可以将这些其他变量设置为其他内容,这样它们就不会指向您的对象。当没有其他变量引用您的对象时,垃圾收集器将自动处理它,包括它具有的任何属性(假设这些属性本身都不是某些东西引用的对象 - 但即便如此宿主对象将被清理,只有属性中的对象会继续存在。

您不能在 Javascript 中以任何其他方式删除对象。

因此,要删除由此创建的对象:

var myInstance = new myObject(24, 42) // How to remove this completely?

像这样清除myInstance:

myInstance = null;

您根本不需要手动删除 myInstance 中的属性。如果没有人引用母对象并且没有任何属性是某人引用的对象,那么垃圾收集器将为您清理所有内容。

delete 运算符主要用于在您希望保留母对象时从对象中删除属性(例如,当您只想删除属性时)。

关于javascript - 如何正确取消引用然后删除 JavaScript 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25457518/

相关文章:

ios - 无法分配给属性 'observationTime' 是一个只读属性

php - 如何将一个 JavaScript 对象复制到另一个对象中?

c - free() 是否将内存归零?

Javascript、 Protractor 和增量计数器

javascript - 使用 node.js 渲染 html

object - “张量”对象没有属性 'assign_add'

php - 调用返回后,PHP 是否垃圾收集函数范围的对象?

memory-management - 如何在 Chapel 中产生一个 nilable 共享对象?

javascript - HighCharts 工具提示中的 Y 值负 1

javascript - 从 DOM 调用服务函数 - Angular 2