2011-07-22 122 views
1
var obj = { 
    destroy: function(){this = null;} 
}; 

obj.destroy(); 

这适用于Chrome,但是Firefox出于某种原因引发此错误。有没有更好的方法来杀死一个方法内的这个对象?如何在Javascript中删除对象crossbrowser

错误:

invalid assignment left-hand side 
[Break On This Error] destroy: function(){this = null;} 
+0

究竟是什么错误? –

+0

无效赋值左手边 [Break On This Error] destroy:function(){this = null;} – Fostah

+0

让对象封装析构函数有什么好处? obj.destroy()优于obj = null吗? – Tim

回答

3

不知道为什么Chrome的允许,但你不能分配一个值了这一点。你可以引用它,但是你不能给它赋值。

如果你想要执行一些数组销毁,你可以在你的销毁方法中引用this.myArrayName并释放你想释放的任何东西,但是你不能只给它分配null来销毁一个实例。

我想你可以尝试这样的事:

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

foo.dispose(); 

差不多接近你可以得到合法抵消“这个” ...

编码愉快。

2

叫我老的方式,而是:

foo = null; 
+0

Wouuldn't'foo = undefined'会更合适吗?我不确定,但是如果我们完全不需要地图上的东西,对我来说更有意义。 –

+0

@CamiloMartin未定义,null表示JavaScript中略有不同的东西。未定义意味着没有设置变量:'var a;'。而'null'意味着变量或多或少为空。但真的差异很小。 – Joe

+1

是的,这就是为什么我认为将一个变量设置为undefined是最接近删除它的原因,因为它的行为或多或少像'delete'关键字。 –

0

我不知道你为什么要做出这一困难。 Javascript是一种垃圾收集语言。所有你需要做的事情是让任何东西都没有更多的引用。

所以,如果你开始:

var obj = { 
    data: "foo"; 
}; 

,现在你想摆脱或“免费”的那个对象,所有你需要做的就是明确提到它:

obj = null; 

由于不再有在代码中,你最初定义并分配给obj该数据结构的任何引用,垃圾收集器会释放它。

的对象不能自我毁灭(因为其他的事情可能有对它的引用)。您可以通过删除对它的所有引用来释放它。一个对象可以清除到其他事情它自己的引用,尽管这通常不需要为删除所有引用对象本身也将其持有的引用的护理(有一些错误与JS和DOM之间的循环引用除外在某些较旧的浏览器中 - 特别是IE)。

一个时候,你可以明确的“删除”事情是,如果你有,你要删除的对象的属性。所以,如果您有:

var obj = { 
    data: "foo", 
    count: 4 
}; 

而且你要删除的“数据”属性,你可以这样做与此:

delete obj.data; 
如果属性/关键是通过变量编程分配

像这样:

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

您可以删除与该键:

delete obj[key];