如何在Javascript crossbrowser中删除对象

如何在Javascript crossbrowser中删除对象,javascript,model-view-controller,object,prototypal,Javascript,Model View Controller,Object,Prototypal,这在Chrome中是有效的,但是firefox出于某种原因抛出了一个错误。有没有更好的方法在一个方法中杀死这个对象 错误: var obj = { destroy: function(){this = null;} }; obj.destroy(); 不知道为什么Chrome允许它,但是你不能给它赋值。您可以引用它,但不能为其赋值 如果要执行一些数组销毁,可以在销毁方法中引用this.myArrayName并释放您试图释放的任何内容,但不能仅将null分配给它来销毁实例 我想你可以试

这在Chrome中是有效的,但是firefox出于某种原因抛出了一个错误。有没有更好的方法在一个方法中杀死这个对象

错误:

var obj = {
    destroy: function(){this = null;}
};

obj.destroy();

不知道为什么Chrome允许它,但是你不能给它赋值。您可以引用它,但不能为其赋值

如果要执行一些数组销毁,可以在销毁方法中引用this.myArrayName并释放您试图释放的任何内容,但不能仅将null分配给它来销毁实例

我想你可以试试这样的东西:

invalid assignment left-hand side
[Break On This Error] destroy: function(){this = null;} 
delete obj.data;
几乎可以在法律上废除“这个”

快乐编码


B

不确定为什么Chrome允许它,但您不能为它赋值。您可以引用它,但不能为其赋值

如果要执行一些数组销毁,可以在销毁方法中引用this.myArrayName并释放您试图释放的任何内容,但不能仅将null分配给它来销毁实例

我想你可以试试这样的东西:

invalid assignment left-hand side
[Break On This Error] destroy: function(){this = null;} 
delete obj.data;
几乎可以在法律上废除“这个”

快乐编码


B

叫我老样子,但是:

var foo = {
    // will nullify all properties/methods of foo on dispose
    dispose: function () { for (var key in this) this[key] = null; }
}

foo.dispose();

叫我老时尚,但是:

var foo = {
    // will nullify all properties/methods of foo on dispose
    dispose: function () { for (var key in this) this[key] = null; }
}

foo.dispose();

我不知道你为什么让这件事变得困难。Javascript是一种垃圾收集语言。要允许某些内容被释放,您所要做的就是确保在任何地方都没有对它的引用

因此,如果您从以下内容开始:

foo = null;
现在,如果您想摆脱或“释放”该对象,只需使用以下命令清除对该对象的引用:

var obj = {
    data: "foo";
};
由于代码中不再有对最初定义并分配给
obj
的数据结构的任何引用,垃圾收集器将释放它

对象无法销毁自身(因为其他对象可能有对它的引用)。您可以通过删除对它的所有引用来释放它。一个对象可以清除它自己对其他事物的引用,尽管这通常不是必需的,因为删除对对象本身的所有引用也会处理它所持有的引用(在某些旧浏览器中,JS和DOM之间存在循环引用的一些bug除外,特别是IE)

有一次,您可能会显式地“删除”某些内容,即您希望删除某个对象上的某个属性。因此,如果您有:

obj = null;
如果您希望删除“data”属性,可以通过以下方法执行此操作:

var obj = {
    data: "foo",
    count: 4
};
如果属性/键是通过如下变量以编程方式分配的:

invalid assignment left-hand side
[Break On This Error] destroy: function(){this = null;} 
delete obj.data;
您可以使用以下方法删除该密钥:

var key = "xxx";
obj[key] = "foo";

我不知道你为什么让这件事变得困难。Javascript是一种垃圾收集语言。要允许某些内容被释放,您所要做的就是确保在任何地方都没有对它的引用

因此,如果您从以下内容开始:

foo = null;
现在,如果您想摆脱或“释放”该对象,只需使用以下命令清除对该对象的引用:

var obj = {
    data: "foo";
};
由于代码中不再有对最初定义并分配给
obj
的数据结构的任何引用,垃圾收集器将释放它

对象无法销毁自身(因为其他对象可能有对它的引用)。您可以通过删除对它的所有引用来释放它。一个对象可以清除它自己对其他事物的引用,尽管这通常不是必需的,因为删除对对象本身的所有引用也会处理它所持有的引用(在某些旧浏览器中,JS和DOM之间存在循环引用的一些bug除外,特别是IE)

有一次,您可能会显式地“删除”某些内容,即您希望删除某个对象上的某个属性。因此,如果您有:

obj = null;
如果您希望删除“data”属性,可以通过以下方法执行此操作:

var obj = {
    data: "foo",
    count: 4
};
如果属性/键是通过如下变量以编程方式分配的:

invalid assignment left-hand side
[Break On This Error] destroy: function(){this = null;} 
delete obj.data;
您可以使用以下方法删除该密钥:

var key = "xxx";
obj[key] = "foo";

无效赋值左侧[Break On This Error]destroy:function(){This=null;}让对象封装其析构函数有什么好处?obj.destroy()是否优于obj=null?您不能(而且您不应该听说过悬空指针?如果它工作,您的代码将创建一个悬空指针)。JavaScript为您处理内存管理。这种方法尤其糟糕——去拿一个它“工作”的浏览器试试吧:我打赌它会提醒你1。听起来ff不允许你将对象设置为null。不知道为什么。与其使用destroy方法,为什么不直接执行:obj=null?它实际上在Chrome上对我不起作用。为什么不使用
delete obj
?无效赋值左侧[Break On This Error]destroy:function(){This=null;}让对象封装其析构函数有什么好处?obj.destroy()是否优于obj=null?您不能(而且您不应该听说过悬空指针?如果它工作,您的代码将创建一个悬空指针)。JavaScript为您处理内存管理。这种方法尤其糟糕——去拿一个它“工作”的浏览器试试吧:我打赌它会提醒你1。听起来ff不允许你将对象设置为null。不知道为什么。与其使用destroy方法,为什么不直接执行:obj=null?它实际上在Chrome上对我不起作用。为什么不使用
delete obj
?我不确定,但如果我们想要完全脱离地图的东西,这对我来说更有意义。@CamiloMartin未定义和null在JavaScript中的意思稍有不同。未定义表示未设置变量:
var a。而
null
表示变量或多或少为空。但实际上差别很小。是的,这就是为什么我认为将变量设置为
undefined
最接近于删除它,因为它的行为或多或少类似于
delete
关键字。不会
foo=undefined