【问题标题】:What is the correct way to handle javascript objects referenced by one variable?处理一个变量引用的 javascript 对象的正确方法是什么?
【发布时间】:2011-08-11 18:39:49
【问题描述】:

我有一个案例,我的 JavaScript 中有一个变量,用于存储对一个类的多个实例的引用。该类创建了一个基于 div 的窗口,有点像灯箱,然后当我调用该类的 removeWindow 方法时,div 窗口元素从 DOM 中删除。所以一个序列可能是这样的:

var divWindow = null;
divWindow = new DivWindowClass(...);
/* do some stuff with the window */
divWindow.removeWindow();

稍后在代码中我再次创建了一个包含不同内容的窗口,但我还希望能够检查 divWindow 变量是否引用了任何内容。

这样做是否正确:

divWindow.removeWindow();
divWindow = null;

if (divWindow == null) { /* etc. */ }

/* later in the code */
divWindow = new DivWindowClass(...); /* with different content than first one */

或者这是否会导致 JavaScript 垃圾收集出现内存问题?如果我将 divWindow 设置为 null,这是否会向垃圾收集发出信号以收集我的对象并摆脱它,或者我还需要做些什么来保持整洁?

一如既往,提前致谢!

【问题讨论】:

  • 如果你愿意,也可以delete它。
  • @pimvdb,在使用 var 语句声明的标识符(还有 function 声明、函数参数名称等)上使用 delete 将无效(它们被绑定为不可配置的属性其环境记录),而且这在严格模式下是不允许的,delete identifier; 被视为SyntaxError。另见:understanding delete
  • 我确实研究过 delete,但我认为 delete 不能用于用 var 声明的变量?所以我不认为这是要走的路。如果我用它,会不会是删除 divWindow;这会将 divWindow 设置为 null,还是我仍然必须这样做以便我以后的条件工作?
  • @CMS 打败我。这是我读到的。
  • @CMS:谢谢。但是,如果我这样做var a = 3; delete a,则无法再访问a

标签: javascript class object memory-leaks garbage-collection


【解决方案1】:

这取决于。例如,如果您在 divWindow 下方定义或表达了一个函数,这意味着垃圾收集器认为 divWindow 可以访问,至少只要该函数存在。在这种情况下,将 divWindow 设置为 null 实际上会导致 GC 在其下一个周期对其进行清理。但是,如果不是这种情况,那么将变量“归零”将不再有帮助。如果您发布了整个代码,我可能会告诉您更多信息。

在 javascript 中没有明确的方法来释放内存。您可以做的最好的事情是了解对您的对象的所有引用,了解它的可访问性,并确保当您不再需要该对象时无法访问它。在你这样做之后,最终你必须学会​​信任垃圾收集器,例如,当你编写想要在 IE 中运行的代码时,这并不容易。

(ps: 我也想打掉上面的评论。delete 运算符用于从对象中删除属性。它不会“删除”变量,也不会释放内存。事实上,如果您在严格模式下执行delete foo;,javascript 将抛出。)

【讨论】:

  • 您的评论:“确保当您不再需要该对象时无法访问它”,我将 divWindow 设置为 null 是否可以告诉 GC?还是安全的方式?
  • 接受这个答案,因为我很欣赏额外的解释。谢谢!
【解决方案2】:

执行第一个解决方案很好。这将向垃圾收集器发出信号,但它对于垃圾收集器可以占用多少是无限小的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 2019-05-12
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2010-10-03
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多