【发布时间】:2011-12-14 01:16:10
【问题描述】:
我必须自己销毁实例吗? ...如果我不给它们分配变量...它们会自动消失吗?
new ImageUploadView();
对
var Iu = ImageUploadView();
【问题讨论】:
-
是的,它们是垃圾收集的。只要存在至少一个对它们的引用,对象就存在。
标签: javascript html browser garbage-collection
我必须自己销毁实例吗? ...如果我不给它们分配变量...它们会自动消失吗?
new ImageUploadView();
对
var Iu = ImageUploadView();
【问题讨论】:
标签: javascript html browser garbage-collection
如果 javascript 中没有对对象的引用,垃圾收集器会清理它。
垃圾收集器的工作方式是寻找没有人引用的 javascript 对象。如果没有人引用它,则不能再次使用它,因此可以将其删除并回收它所占用的内存。另一方面,如果任何 javascript 实体仍然具有对该对象的引用,则它仍然“正在使用”并且不能被删除。
在您的第一个代码示例中:
new ImageUploadView();
除非对象的构造函数将 this 指针存储到其他变量或对象中,或者创建一些导致对该对象的引用被持有的闭包,否则将不会引用这个新对象,它将是由垃圾收集器清理。
如果你第二个代码示例:
var Iu = ImageUploadView();
只要Iu 变量存在并保持在范围内,它将包含ImageUploadView() 函数返回的任何内容。请注意,第二个示例只是执行一个函数并存储它的值。它不一定创造任何东西。如果ImageUploadView() 只返回true,那么这就是Iu 变量将包含的所有内容。
【讨论】:
:P
function Obj () { return true; }; var o = new Obj(); o == true;。我的控制台显示为假。 new SomeFunction() 返回 Object,而不是 SomeFunction() 的返回值。
new。这只是一个函数调用。
第一种方法很好。假设ImageUploadView 的实例在其自身之后进行了适当的清理,它将被垃圾收集器收集。
【讨论】:
ImageUploadView 在其自身范围之外做任何事情,那么对它的引用可能会一直存在。例如,创建全局变量、向 DOM 或全局对象添加属性、绑定事件 - 特别是在使用闭包或以其他方式传递闭包时。
对于大型对象,假设内置垃圾收集器的浏览器会在超出范围时进行清理,这不一定是一个好习惯。您最好使用“删除”自行清除。例如:
delete MyImageUploadView;
编辑:如果对象未被作为属性引用,则最好将其设置为 null。
【讨论】: