【问题标题】:in JavaScript, when finished with an object created via new ActiveXObject, do I need to set it to null?在 JavaScript 中,完成通过 new ActiveXObject 创建的对象后,是否需要将其设置为 null?
【发布时间】:2011-08-15 16:24:54
【问题描述】:

在 WSH 中运行并创建对象的 Javascript 程序中,比如说 Scripting.FileSystemObject 或任何任意 COM 对象,我是否需要在完成后将变量设置为 null?例如,我是否建议这样做:

var fso = new ActiveXObject("Scripting.FileSystemObject");
var fileStream = fso.openTextFile(filename);
fso = null;  // recommended?  necessary? 
... use fileStream here ...
fileStream.Close();
fileStream = null;  // recommended? necessary?

效果与让变量超出范围有什么不同吗?

【问题讨论】:

    标签: javascript wsh activexobject jscript


    【解决方案1】:

    将 null 分配给对象变量将减少引用计数器,以便内存管理系统可以丢弃资源 - 只要感觉像它。当变量超出范围时,引用计数器将自动递减。因此,在几乎所有情况下,手动操作都是浪费时间。

    理论上,如果在中间将 A 设置为 null,则函数在其第一部分使用大对象 A,在其第二部分使用另一个大对象 B,可能会更节省内存。但是由于这不会迫使mms销毁A,因此该声明仍然可能是一种浪费。

    如果你做了一些花哨的类设计,你可能会得到循环引用。然后手动打破圆圈可能是必要的 - 但也许首先避免这样的循环会更好。

    有传言称,古老的数据库访问对象存在可以通过改变变量来避免的错误。我不会将我的编程规则建立在这种巫术之上。

    (互联网上有大量的 VBscript 代码充满了“Set X = Nothing”;当被问到时,作者倾向于谈论“习惯”和其他语言(C、C++))

    【讨论】:

      【解决方案2】:

      以 Ekkehard.Horner 所说的话为基础......

      VBScript、JScript 和 ASP 等脚本在为您管理内存的环境中执行。因此,将对象引用显式设置为 Null 或 Empty,并不一定会将其从内存中删除……至少不会立即删除。 (实际上,它通常几乎是瞬间完成的,但实际上,任务被添加到环境中的队列中,并在稍后的某个时间点执行。)在这方面,它确实没有你想象的那么有用。

      在编译后的代码中,在程序(或某些情况下的代码段)结束之前清理内存非常重要,以便将所有分配的内存返回给系统。这可以防止各种问题。除了缓慢运行的代码之外,这在程序退出时是最重要的。在 ASP 或 WSH 等脚本环境中,内存管理会在脚本退出时自动进行清理。因此,即使您自己没有明确地这样做,所有对象引用都为您设置为 null,这使得在这种情况下整个混乱变得不必要。

      就脚本执行期间的内存问题而言,如果您构建的数组或字典对象大到足以引起问题,那么您要么超出了脚本的范围,要么在代码中采用了错误的方法。换句话说,这应该永远在 VBScript 中发生。事实上,环境对数组和字典对象的大小施加了限制,以便从一开始就防止这些问题。

      【讨论】:

        【解决方案3】:

        如果您有长时间运行的脚本在顶部/开始处使用对象,而在主进程中不需要这些对象,将这些对象设置为 null 可以更快地释放内存并且不会造成任何伤害。正如其他海报所提到的,可能没有什么实际好处。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-18
          • 2019-09-15
          • 1970-01-01
          相关资源
          最近更新 更多