Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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 从DOM和内存中动态加载和删除JS代码_Javascript - Fatal编程技术网

Javascript 从DOM和内存中动态加载和删除JS代码

Javascript 从DOM和内存中动态加载和删除JS代码,javascript,Javascript,基本上,我想把这样的JS文件动态加载到页面中 globalVar = "some variable"; alert(globalVar); 然后我想删除它,我可以很容易地从DOM中删除脚本,但我会将globalVar保留在内存中 是否有JS库可以帮助我加载脚本,然后卸载脚本,卸载脚本声明的所有变量、类和函数?或者有一些技巧可以做到这一点吗?在JavaScript中,当您声明一个全局变量时,它实际上是“全局”对象(通常是DOMWindow或“window”)的一个属性,因此您只需通过变量名删除该

基本上,我想把这样的JS文件动态加载到页面中

globalVar = "some variable";
alert(globalVar);
然后我想删除它,我可以很容易地从DOM中删除脚本,但我会将
globalVar
保留在内存中


是否有JS库可以帮助我加载脚本,然后卸载脚本,卸载脚本声明的所有变量、类和函数?或者有一些技巧可以做到这一点吗?

在JavaScript中,当您声明一个全局变量时,它实际上是“全局”对象(通常是DOMWindow或“window”)的一个属性,因此您只需通过变量名删除该属性即可删除全局引用。例如:

var foo = 123;
alert(foo); // Alerts "123"
alert(window.foo); // Alerts "123"
delete window.foo;
foo; // ReferenceError: foo is not defined.
因此,如果您可以跟踪您使用的全局变量(应该是非常非常少的,就像一个),您可以将其作为属性从“窗口”或“全局”根级别对象中删除

更新


您可以将此想法扩展到一般情况,如下所示。在脚本开始时,枚举全局对象的属性并将其存储在引用对象中。然后,当您想要标识新添加的全局属性时,再次枚举全局属性,并仅存储引用对象中不存在的属性(这意味着它们是自上次选中后新添加的)。然后简单地删除这些附加属性。

这是可怕的JavaScript。如果要导入的JS在删除全局对象时没有对全局对象做任何值得保留的事情(例如更改DOM),那么它就不应该向全局对象写入新变量

希望您能够控制导入的JS,并且应该将代码封装在一个自执行函数中,并确保所有变量声明都以
var
开头。这意味着您没有用自己的变量污染全局对象,您可以在脚本中执行任何需要的操作。您上面的代码将变成:

function() {
  var globalVar = "some variable";
  alert(globalVar);
}();
这将确保没有新变量写入全局对象,并且您仍然可以访问它们来更改它们(这可能是您需要做的)


如果你想要更多的信息,你能不能对这个重要的脚本的实际功能做一些说明?

。。正如我所说。。我动态加载JS,我只是不知道它将声明什么variebles、classed、函数……是否有一个“准备就绪”的代码或框架来实现这一点?“我和哈斯克尔一样懒”:)我认为你在某种程度上是对的。。现在,我将您的“解决方案”标记为一个答案……在您编写它时,它可能是正确的,但在现代SPA中,异步模块加载和卸载是可取的。假设您有多个网页,其中需要在特定元素上实例化jquery插件。当您导航到新页面时,上一页面的代码和事件侦听器仍然存在。感谢necro帖子。为什么你要在SPA中卸载一个模块,却又想保持模块的效果?