我有一个案例,我的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,是否会向垃圾收集器发出信号以收集我的对象并将其删除,或者还有其他我需要做的事情来保持整洁?
一如既往,提前谢谢!
答案 0 :(得分:1)
这取决于。例如,如果你在divWindow下面定义或表达了一个函数,那就意味着垃圾收集器认为divWindow是可以访问的,至少只要存在该函数。在这种情况下,将divWindow设置为null实际上会导致GC在下一个周期清理它。但是,如果情况并非如此,那么“归零”变量将不会比正常情况更有帮助。如果你发布了整个代码,我可能会告诉你更多。
没有明确的方法来释放javascript中的内存。您可以做的最好的事情是了解对象的所有引用,知道它的可达性,并确保在您不再需要它时无法访问该对象。在你这样做之后,最终,你必须学会信任垃圾收集器,当你编写你想要在IE中运行的东西时,这并不容易。
(ps:我也想删掉上面的评论。delete
运算符用于从对象中删除属性。它不会“删除”变量,也不会释放内存。实际上,如果你在严格模式下执行delete foo;
,则会抛出javascript。)
答案 1 :(得分:0)
做第一个解决方案很好。这将向垃圾收集器发出信号,但它对于垃圾收集器可以占用的数量是无穷小的。