Garbage, 1); }
第一行代码调用excel.Quit()方法来使得excel进程中止并退出,这时由于JavaScript 环境执有excel对象实例,因此excel进程并不实际中止。
第二行代码使excel为null,以清除对象引用,从而使对象“失效”。然而由于 对象仍旧在函数上下文环境中,因此如果直接调用GC过程,对象仍然不会被清理。
第三行代码使用setTimeout()来调用CollectGarbage函数,时间间隔设为'1',只 是使得GC过程发生在writeXLS()函数执行完之后。这样excel对象就满足了“能被 GC清理”的两个条件:没有引用和离开上下文环境。
GC过程的使用,在使用了ActiveX Object的JS环境中很有效。一些潜在的ActiveX Object包括XML、VML、OWC(Office Web Componet)、flash,甚至包括在JS中的VBArray。 从这一点来看,ajax架构由于采用了XMLHTTP,并且同时要满足“不切换页面”的 特性,因此在适当的时候主动调用GC过程,会得到更好的效率用UI体验。
事实上,即使使用GC过程,前面提到的excel问题仍然不会被完全解决。因为IE还 缓存了权限凭据。使页的权限凭据被更新的唯一方法,只能是“切换到新的页面”, 因此事实上在前面提到的那个SPS项目中,我采用的方法并不是GC,而是下面这一 段代码: //--------------------------------------------------------- // 处理ActiveX Object时采用的页面切换代码 //--------------------------------------------------------- function writeXLS() { //(略...)
excel.Quit(); excel = null; // 下面代码用于解决IE call Excel的一个BUG, MSDN中提供的方法: // setTimeout(CollectGarbage, 1); // 由于不能清除(或同步)网页的受信任状态, 所以将导致SaveAs()等方法在 // 下次调用时无效. location.reload(); }
最后之最后,关于GC的一个补充说明:在IE窗体被最小化时,IE将会主动调用一次 CollectGarbage()函数。这使得IE窗口在最小化之后,内存占用会有明显改善。
上一页 [1] [2] |