2011-03-29 77 views
1

基本上我想加载JS文件中像这样到页面动态动态加载和删除JS代码从DOM和内存

globalVar = "some variable"; 
alert(globalVar); 

然后我想删除它,我可以很容易地从DOM删除脚本,但我将有globalVar留在记忆里......

是否有一个JS库,将帮助我加载脚本,然后卸载它和卸载所有的变量,类,通过该脚本被宣称的功能呢?还是有一些技巧可以做到这一点?

回答

0

这是可怕的JavaScript。如果你要导入的JS对全局对象没有任何帮助,那么当你删除它时(例如改变DOM),它就不应该为全局对象编写新变量。

希望你有超过进口JS控制,并应封装代码的自动执行功能,并保证所有的变量声明开始var。这意味着你不会用自己的变量来污染全局对象,并且可以在脚本中执行任何你需要的操作。上面的代码将成为:

function() { 
    var globalVar = "some variable"; 
    alert(globalVar); 
}(); 

这将确保没有新的变量被写入到全局对象,你仍然有机会获得他们改变他们(这大概你需要做的)。

如果您想了解更多信息,您是否可以更多地了解重要剧本的实际效果?

+0

我认为你在某种程度上是正确的..我会标记你的'解决方案'作为现在的答案... – 2011-04-05 12:23:42

+0

它可能是你写的时候,但是在现代SPA中,异步模块的加载和卸载是需要的。说你有多个网页,你需要在特定元素上实例化一个jQuery插件。当您导航到新页面时,上一页的代码和事件侦听器仍然存在。 – r3wt 2015-01-07 08:56:43

+0

感谢necro的帖子。你为什么要在SPA中卸载一个模块,但又想保持模块的效果? – EMMERICH 2015-01-13 08:00:45

3

在JavaScript中,当您声明一个全局变量时,它实际上是“全局”对象(通常是DOMWindow或“窗口”)的一个属性,因此您可以简单地通过变量的名称删除全局引用。例如:

var foo = 123; 
alert(foo); // Alerts "123" 
alert(window.foo); // Alerts "123" 
delete window.foo; 
foo; // ReferenceError: foo is not defined. 

所以,如果你可以跟踪全局变量的使用(这应该是非常非常少,像一个),你可以删除它从“窗口”属性或“全球“根级对象。

更新

您可以扩展这个想法通常的工作方式如下。在脚本开始处,枚举全局对象的属性并将它们存储在引用对象中。然后,当您想要标识新添加的全局变量时,请再次枚举全局属性,并仅存储引用对象中不存在的属性(这意味着它们是自上次检查后新添加的)。然后简单地删除这些附加属性。

+0

好吧..正如我所说的..我动态加载JS,我只是不知道什么variebles,分类,功能它将宣布... – 2011-03-29 09:39:58

+0

@Ai_boy:请参阅我的答案中新添加的段落。 – maerics 2011-03-29 09:45:03

+0

是否有一个“准备好”的代码或框架来做到这一点? “我很懒,因为哈斯克尔”:) :) – 2011-03-29 09:54:52