包含<script>标签与使用eval相比,是否有性能提升?

puk*_*puk 12 javascript performance eval

我已经看到很多关于如何动态添加代码的建议(来源):

var myScript = document.createElement("script");
myScript.setAttribute("type","text/javascript");
myScript.innerHTML += 'alert("Hello");';
document.body.appendChild(myScript);
Run Code Online (Sandbox Code Playgroud)

而不是eval像现在这样

eval('alert("Hello");');
Run Code Online (Sandbox Code Playgroud)

人们抱怨性能下降和安全问题eval,但我无法想象添加<script>标签会更快或更安全.


编辑人想知道为什么我evaling微不足道的东西alert("Hello"),这是为什么:

我有一个数据库,比方说,1,000,000,000,000个脚本= P显然我不能加载每一个,而是用户可以加载任何他们想要的.脚本存储在服务器端的arbritrary位置.目前我通过其脚本名称请求(xmlhttprequest解释为javascript)脚本,服务器将以某种方式找到它并将其作为文本返回,立即执行/解释.我想知道将脚本作为文本返回是否更好,然后从中创建一个<script>标记.

此外,这不是eval()和附加脚本标记之间Javascript差异的重复,它处理功能差异,这里我想要性能和安全性差异.

Thi*_*iff 7

不,与使用<script>标签相比,使用标签没有性能提升eval.在你给出的两个样本中,eval我测试的所有浏览器都要快得多.部分不同之处在于<script>,除了运行脚本之外,它还在修改DOM,但这不是全部.使用更长的脚本,差异并不明显,但eval仍然更快:

更新:我更新了演示以更好地匹配测试头对头(两者现在都在创建script块).结果仍然显示eval得更快.

jsPerf:http://jsperf.com/stackoverflow-8380204-eval-vs-script

在此输入图像描述

因此,不使用的原因eval仅与安全相关.从接受的答案为什么使用JavaScript eval函数一个坏主意?:

  1. eval的不正确使用会打开您的注入攻击代码
  2. 调试可能更具挑战性(没有行号等)

还有第三个谈论速度,但它在答案的评论中被驳斥.如果您不能保证您计划的脚本的来源eval,则应该避免.

另外:根据问题末尾的使用模式,您可能需要检查require.js以动态加载脚本.