如何卸载windows.eval()加载和解释Javascript?

时间:2012-07-15 22:45:51

标签: javascript eval

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

对于Javascript插入到现在为止,我们动态创建脚本标记并将它们附加到DOM,不仅是为了提高现代浏览器的速度,还因为这样可以在不再需要模板时清理/删除脚本。

然而 - 似乎在旧浏览器和IE(甚至是最新的10版本)中,特别是window.eval()在评估代码方面要快得多,而不仅仅是通过新标签注入 - 比如快10倍。甚至IE-native execScript也比eval慢很多。

我尝试优化它以使用eval来提高IE中的性能,但是之后我没有看到任何方法来引用或删除这样评估的Javascript。如果有人对如何解决这个问题有任何想法 - 会很感激。

1 个答案:

答案 0 :(得分:3)

  

对于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;

...前提是它没有提供不清理的引用(例如设置事件处理程序或其他闭包)。