如果要在Javascript中强制对变量进行垃圾收集,最好将其设置为null还是未定义?

如果要在Javascript中强制对变量进行垃圾收集,最好将其设置为null还是未定义?,javascript,performance,Javascript,Performance,我正在使用JS框架开发一款Android游戏。我想确保在使用完某些对象后,它们会被垃圾收集。我怎么强迫它?我应该使用null还是未定义 你不能强制垃圾收集(不是以任何理智的方式) 如果变量没有自动超出范围,只需将它们设置为null 最好的建议是在使它们符合垃圾收集条件的范围内定义它们。这意味着不要使用永远不符合收集条件的全局变量。相反,将它们声明为局部变量。您可以将其设置为null,如果这是对该对象的最后一次引用,则该对象将符合垃圾收集的条件 不过,TGH的建议是最好的,我建议 如果要在Jav

我正在使用JS框架开发一款Android游戏。我想确保在使用完某些对象后,它们会被垃圾收集。我怎么强迫它?我应该使用null还是未定义

你不能强制垃圾收集(不是以任何理智的方式)


如果变量没有自动超出范围,只需将它们设置为
null

最好的建议是在使它们符合垃圾收集条件的范围内定义它们。这意味着不要使用永远不符合收集条件的全局变量。相反,将它们声明为局部变量。

您可以将其设置为null,如果这是对该对象的最后一次引用,则该对象将符合垃圾收集的条件

不过,TGH的建议是最好的,我建议

如果要在Javascript中强制对变量进行垃圾收集,最好将其设置为null还是未定义

没关系,您甚至可以将它设置为您创建的另一个对象:只要变量最初引用的对象不再在任何地方被引用,它就可以被垃圾收集。将对象视为“被变量引用的对象”

如果没有变量引用它,它可以被垃圾收集,“将另一个对象放入变量”将使变量不再引用前一个对象


我想确保在使用完某些对象后,它们会被垃圾收集。我该如何强制它

通过使用
--expose gc
标志并运行以下命令,可以强制在基于节点的运行时(例如,Electron或NW.js)中触发主要垃圾回收:

global.gc();
如果您的应用/游戏基于浏览器,则仅在Chrome中,您可以使用
--allow natives syntax
开关(您的用户需要将其传递给Chrome本身),并调用:

%CollectGarbage();
注意:非常简单,但如果您可以轻松地从停止的位置继续(例如,如果您愿意,可以将游戏重新加载到另一个关卡),您也可以使用
window.location.reload()
作为后备方法

但是,请记住,这些调用不会出错,如果有大量垃圾要收集,它们可能会阻塞整秒钟。如果你已经确定了游戏中的暂停时间,比如在不同关卡之间加载屏幕,这可能会很理想,但在其他情况下会很棘手


您可能还想考虑使用或不使用手动垃圾收集来简单地减少垃圾和提高性能。

现在很难编写不符合GC的JS。别担心。如果您处理完对象,它们将被垃圾收集。如果不是,那就是JS运行时中的错误。在最坏的情况下,这是您在优化阶段处理的事情,但它不会影响体系结构。您是说globals永远不会成为垃圾收集的候选对象吗?例如,如果我设置了一个
window.bigdata=create5meg()
,然后将全局设置为
window.bigdata=null,5兆数据不会被垃圾收集?