1

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

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

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

我会尝试优化它以在 IE 中使用 eval 来提高性能,但是我看不到任何引用或/和删除此类评估的 Javascript 的方法。如果有人对如何解决这个问题有任何想法 - 将不胜感激。

4

1 回答 1

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;

...只要它没有给出不清理的对自身的引用(例如设置事件处理程序或其他闭包)。

于 2012-07-15T23:01:28.707 回答