Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,当使用通过新ActiveXObject创建的对象完成时,是否需要将其设置为null?_Javascript_Wsh_Activexobject_Jscript - Fatal编程技术网

在JavaScript中,当使用通过新ActiveXObject创建的对象完成时,是否需要将其设置为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

在WSH中运行并创建对象(比如Scripting.FileSystemObject或任意COM对象)的Javascript程序中,我是否需要在使用完变量后将其设置为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?

其效果是否不同于仅仅让变量超出范围?

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

理论上,如果A在第二部分中的第一个对象和另一个大对象B,如果A在中间被设为空,则可以使用更大的存储效率。但由于这并不会迫使mms销毁一份文件,因此该声明可能仍然是一种浪费

如果你做一些奇特的类设计,你可能会得到循环引用。那么,用手打破这个循环也许是必要的——但也许首先避免这样的循环会更好

有传言说,古代的数据库访问对象存在可以通过消除变量来避免的bug。我不会把我的编程规则建立在这样的伏都教基础上


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

基于Ekkehard.Horner所说的

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

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


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

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