如何卸载windows.eval()加载并解释的Javascript

How to unload windows.eval() loaded and interpreted Javascript?

本文关键字:解释 Javascript 加载 windows 何卸载 卸载 eval      更新时间:2023-10-24

有一个复杂的客户端模板系统,其中资源通过XHR加载(作为字符串),然后注入DOM。

到目前为止,对于Javascript插入,我们一直在动态创建脚本标记并将其附加到DOM中,这不仅是为了在现代浏览器中提高速度,而且因为这使得在不再需要模板时可以清理/删除脚本。

然而,在旧的浏览器和IE(甚至是最新的10版本)中,尤其是window.eval()在评估代码时要比通过新标签注入代码快得多,比如快10倍。即使是IE本机execScript也比eval慢很多。

我会尝试优化它,以便在IE中使用eval来提高性能,但我看不出有任何方法可以在之后引用或/或删除这样评估过的Javascript。如果有人对此有任何想法,我们将不胜感激。

到目前为止,对于Javascript插入,我们一直在动态创建脚本标记并将其附加到DOM中,这不仅是为了在现代浏览器中提高速度,而且因为这使得在不再需要模板时可以清理/删除脚本。

我想你可能误解了什么。删除script元素并不会将其包含的脚本从加载到的JavaScript上下文中删除:http://jsbin.com/ujirat

然而,在旧的浏览器和IE(甚至是最新的10版本)中,特别是window.eval()在评估代码时要比通过新标签注入代码快得多,比如10倍的速度。。。然而,我看不出有任何方法可以在之后引用或/或删除这样评估过的Javascript。

它与通过script标记加载的脚本完全相同:"卸载"它的唯一方法是删除对它的所有引用,这使它有资格进行垃圾收集。最好的方法是让脚本定义一个单个全局符号,该符号包含该脚本的所有功能,例如:

var foo = (function () {
    var f = {};
    f.foo = function() { ... };
    f.bar = function() { ... };
    return f;
})();

然后你可以通过以下操作"卸载":

foo = undefined;

前提是它不提供对自己的引用,而这些引用不会被清除(例如设置事件处理程序或其他闭包)。