3

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

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

4

3 回答 3

5

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

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

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

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

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

于 2011-04-29T18:30:51.813 回答
1

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

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

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

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

于 2011-04-30T08:15:41.063 回答
0

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

于 2013-01-30T12:28:59.637 回答