在JavaScript中,当完成通过新ActiveXObject创建的对象时,是否需要将其设置为null?

时间:2011-04-29 17:51:34

标签: javascript wsh activexobject jscript

在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?

效果不同于让变量超出范围吗?

3 个答案:

答案 0 :(得分:5)

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

理论上,如果A在中间设置为null,则在其第一部分中使用大对象A而在第二部分中使用另一个大对象B的函数可以更有效。但由于这并没有迫使mms摧毁A,声明仍然是一种浪费。

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

有传言称古代数据库访问对象存在可以通过切换变量来避免的错误。我不会将我的编程规则建立在这样的伏都教上。

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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