Javascript 函数执行后,函数中创建的对象是否被销毁?

Javascript 函数执行后,函数中创建的对象是否被销毁?,javascript,Javascript,这可能不是一个典型的问题,因为它是关于Javascript的,必须在Windows7小部件引擎下运行,使用旧的IE引擎(不记得有多旧)。 我想做的是列出硬盘上的一些文件。这很好,但这只是我问题的一个例子 正如您在代码中看到的,我正在创建ActiveXObject和枚举器的实例。理论上,所有这些对象都应该在函数执行后销毁,因为保存在函数堆栈中的所有引用都应该删除。但在这里,这似乎不是很有效 为什么我这么认为?因为这个小部件在运行数周而没有重启和sidebar.exe进程的机器上工作,随着时间的推移

这可能不是一个典型的问题,因为它是关于Javascript的,必须在Windows7小部件引擎下运行,使用旧的IE引擎(不记得有多旧)。 我想做的是列出硬盘上的一些文件。这很好,但这只是我问题的一个例子

正如您在代码中看到的,我正在创建ActiveXObject和枚举器的实例。理论上,所有这些对象都应该在函数执行后销毁,因为保存在函数堆栈中的所有引用都应该删除。但在这里,这似乎不是很有效

为什么我这么认为?因为这个小部件在运行数周而没有重启和sidebar.exe进程的机器上工作,随着时间的推移,它正在消耗越来越多的内存(函数f_scanrec每隔几天运行一次,我确信它不是其他正在增长的东西,我花了几个月的时间来解决这个问题)。如果不运行此函数,sidebar.exe在内存中的大小将保持不变

在Javascript中,我不能手动删除创建的对象。那么,我能做些什么,它到底是如何工作的

function f_scanrec(vS_path) {
    var vO_scanfs = new ActiveXObject("Scripting.FileSystemObject");
    var vO_dir = vO_scanfs.GetFolder(vS_path);
    var vO_enum = false;

    vO_enum = new Enumerator(vO_dir.SubFolders);
    for (; !vO_enum.atEnd(); vO_enum.moveNext()) {
        f_scanrec(vO_enum.item().Path);
    }
    vO_enum = new Enumerator(vO_dir.Files);
    for (; !vO_enum.atEnd(); vO_enum.moveNext()) {
/* Do something with this enumerator, but no more recursion calls */
    }
}
编辑-找到解决方案

在对Jaromanda X写的这篇帖子下的评论中的解决方案进行了4个月的测试后:


我会说,是的,在这种代码模式中,它们将是GC。。。但是,后来我读了ActiveX——所以,微软是微软,我想说可能不是,因为,是微软,是老微软的“技术”应该在20年前就死了,但还没有死:p

我回答说:

每次函数调用都会创建此ActiveXObject。我把它移到这个函数之外。现在它在小部件启动时创建一次,并且它的引用只存储在一个全局变量中。所有这些似乎都以与以前相同的方式工作,因此代码可以正常工作。现在我将看到,随着时间的推移,这将有所帮助


这就是解决办法。在开启Windows7小工具近两个月的不间断工作后,它们仍然占用了大约130MB的内存!所以这个解决方案是有效的

我会说,是的,在这种代码模式中,它们将是GC。。。但是,然后我读了《ActiveX》——所以,微软是微软,我想说可能不是,因为,是微软,是老微软的“技术”应该在20年前就死了,但没有:p@JaromandaX我想你说到点子上了!每次函数调用都会创建此ActiveXObject。我把它移到这个函数之外。现在它在小部件启动时创建一次,并且它的引用只存储在一个全局变量中。所有这些似乎都以与以前相同的方式工作,因此代码可以正常工作。现在我将看到,随着时间的推移,这将有所帮助。非常感谢您为我指出可能的问题:)问候:)