【问题标题】: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 可以更快地释放内存并且不会造成任何伤害。正如其他海报所提到的,可能没有什么实际好处。