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

标签 javascript eval

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

到目前为止,对于 Javascript 插入,我们一直在动态创建脚本标签并将它们附加到 DOM,这不仅是为了提高现代浏览器的速度,也是因为一旦不再需要模板,就可以清理/删除脚本.

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

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

最佳答案

For Javascript insertion up until now we were dynamically creating script tags and appending them to the DOM, not only for speed in modern browsers but also because this makes it possible to cleanup/remove the scripts once the template is not needed any more.

我认为您可能误解了其中的内容。删除 script 元素不会从它加载到的 JavaScript 上下文中删除它包含的脚本:http://jsbin.com/ujirat

However - it seems that in older browsers and IE (even the latest 10 version) in particular window.eval() is a lot faster in evaluating code than just injecting it via new tags - like 10x as fast...however I don't see any way to reference or/and remove such evaluated Javascript afterwards.

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

var foo = (function () {
    var f = {};

    f.foo = function() { ... };

    f.bar = function() { ... };

    return f;
})();

然后您可以通过执行以下操作“卸载”:

foo = undefined;

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

关于javascript - 如何卸载 windows.eval() 加载和解释的 Javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11496282/

相关文章:

javascript - 加载覆盖图像时防止显示列表项

r - 在 R 中,get ("abc") 和 eval(parse(text ="abc")) 有什么区别

Javascript:返回在 eval 中创建的值

javascript - 为什么 'eval'执行会出错?

python - 使用cookiecutter捕获eval()SyntaxError的问题

javascript - 为什么 eval() 在 Javascript 中给出未定义的值?

javascript - HTML5 JS fillRect() 奇怪的行为

javascript - WordPress 内置函数无法在 ajax php 文件上识别

javascript - ngTable 未加载数据

javascript - 在移动器悬停时停止 gif 不起作用