在JavaScript中,当使用通过新ActiveXObject创建的对象完成时,是否需要将其设置为null?
在WSH中运行并创建对象(比如Scripting.FileSystemObject或任意COM对象)的Javascript程序中,我是否需要在使用完变量后将其设置为null?例如,建议我这样做:在JavaScript中,当使用通过新ActiveXObject创建的对象完成时,是否需要将其设置为null?,javascript,wsh,activexobject,jscript,Javascript,Wsh,Activexobject,Jscript,在WSH中运行并创建对象(比如Scripting.FileSystemObject或任意COM对象)的Javascript程序中,我是否需要在使用完变量后将其设置为null?例如,建议我这样做: var fso = new ActiveXObject("Scripting.FileSystemObject"); var fileStream = fso.openTextFile(filename); fso = null; // recommended? necessary? ... us
var fso = new ActiveXObject("Scripting.FileSystemObject");
var fileStream = fso.openTextFile(filename);
fso = null; // recommended? necessary?
... use fileStream here ...
fileStream.Close();
fileStream = null; // recommended? necessary?
其效果是否不同于仅仅让变量超出范围?为对象变量指定null将减少引用计数器,以便内存管理系统可以丢弃资源—只要它感觉需要。当变量超出范围时,参考计数器将自动递减。因此,在几乎所有情况下,手动操作都是浪费时间 理论上,如果A在第二部分中的第一个对象和另一个大对象B,如果A在中间被设为空,则可以使用更大的存储效率。但由于这并不会迫使mms销毁一份文件,因此该声明可能仍然是一种浪费 如果你做一些奇特的类设计,你可能会得到循环引用。那么,用手打破这个循环也许是必要的——但也许首先避免这样的循环会更好 有传言说,古代的数据库访问对象存在可以通过消除变量来避免的bug。我不会把我的编程规则建立在这样的伏都教基础上
(互联网上有大量的VBscript代码充满了“Set X=Nothing”;当被问及时,作者倾向于谈论“习惯”和其他语言(C,C++)基于Ekkehard.Horner所说的 VBScript、JScript和ASP等脚本是在为您管理内存的环境中执行的。因此,显式地将对象引用设置为Null或Empty并不一定会将其从内存中删除…至少不会立即删除。(在实践中,它通常几乎是即时的,但实际上,任务被添加到环境中的队列中,该队列将在稍后的某个时间点执行。)在这方面,它实际上没有您想象的那么有用 在编译代码中,在程序(或某些情况下的代码段)结束之前清理内存非常重要,以便将分配的内存返回给系统。这可以防止各种问题。除了缓慢运行的代码外,这在程序退出时是最重要的。在ASP或WSH等脚本环境中,当脚本退出时,内存管理会自动进行清理。因此,所有对象引用都被设置为null,即使您自己没有显式地这样做,这使得整个混乱在这个实例中变得不必要
至于脚本执行期间的内存问题,如果您构建的数组或字典对象大到足以引起问题,那么您要么已经超出了脚本的范围,要么在代码中采取了错误的方法。换句话说,在VBScript中不应该发生这种情况。事实上,环境对数组和字典对象的大小施加了限制,以便从一开始就防止这些问题。如果您有长时间运行的脚本,在主进程中不需要在顶部/开始使用对象,则将这些对象设置为null可能会更快地释放内存,不会造成任何伤害。正如其他海报所提到的,可能没有什么实际好处