什么是更好的做法:eval或追加脚本?

时间:2012-02-03 13:52:03

标签: javascript jquery dom eval

我需要执行一些我从一些AJAX调用中获得的自定义JavaScript。我可以做eval字符串,或者我可以将它附加到script - 标记到DOM。哪种方法会更好?

var dynamicScript = 'alert(\'Hello world!\');';

方法1 - 脚本

var x = '<script type="text/javascript">' + dynamicScript  +'</scr' + 'ipt>';
$(document.body).append(x);

方法2 - 评估

eval(dynamicScript);

哪种方法更好,为什么?还是有更好的选择?

4 个答案:

答案 0 :(得分:11)

我更喜欢eval,因为它通常是faster而不是创建脚本标记并附加它(特别是如果你想使用jQuery创建和插入它)。

附注(脚本标签的有用应用)我还使用脚本标签插入方法:在Google Chrome的扩展中,注入脚本标签是在页面范围内运行代码的唯一方法,因为window对象是沙箱。

PS。 jQuery.getScript()的概念。这种方法可能很有用。

答案 1 :(得分:2)

这两种方法对你正在做的事情都没有那么好。您的AJAX调用应该返回数据而不是序列化脚本。这两种方法都可以打开脚本注入。

eval应该不惜一切代价。这是缓慢而危险的,eval is evil

答案 2 :(得分:2)

如果ajax调用返回带脚本标记的html,则可以使用$ .load()导入脚本。

http://api.jquery.com/load/

答案 3 :(得分:2)

将其添加到DOM。理由(取自http://ajaxpatterns.org/On-Demand_Javascript):

JavaScript将自动进行评估,其方式与首次遇到标记时评估静态HTML中链接的JavaScript的方式大致相同。您可以在不将其添加到窗口的情况下声明裸函数或变量。

您可以从外部域加载JavaScript。

URL指向特定的Javascript资源。使用XMLHttpRequest,可以获得更大的灵活性:例如,您可以在不同的XML节点内发送多个JavaScript代码段。

DOM以不同的方式受到影响。即使行为是暂时的,脚本也会被添加到DOM中,而在XMLHttpRequest回调之后它会消失。