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

标签 javascript performance eval

我看到很多关于如何像这样动态添加代码的建议 (source) :

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

相对于eval像这样

eval('alert("Hello");');

人们提示 eval 的性能下降和安全问题,但我无法想象如何添加 <script>标签会更快或更安全。


编辑 人们想知道为什么我要评估像 alert("Hello") 这样微不足道的东西。 ,原因如下:

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

此外,这不是 Javascript difference between eval() and appending script tags 的副本,处理功能差异,这里我想要性能和安全差异。

最佳答案

不,使用 <script> 没有性能提升标签而不是使用 eval .在您提供的两个样本中,eval在我测试的所有浏览器中都快得多。部分区别在于 <script> ,除了运行脚本,它还在修改DOM,但这还不是全部。对于较长的脚本,差异并不明显,但 eval仍然更快:

更新:我更新了演示以更好地匹配测试(两者现在都在创建 script block )。结果还是显示eval快得多。

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

enter image description here

因此,不使用 eval 的原因仅与安全相关。来自 Why is using the JavaScript eval function a bad idea? 上接受的答案:

  1. Improper use of eval opens up your code for injection attacks
  2. Debugging can be more challenging (no line numbers, etc.)

还有第三个是讲速度的,但是在那个回答的评论里反驳了。如果你不能保证你计划的脚本来源eval ,应该避免。

顺便说一句:根据问题末尾的使用模式,您可能需要查看 require.js用于动态加载脚本。

关于javascript - 与使用 eval 相比,包含 &lt;script&gt; 标签是否有性能提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8380204/

相关文章:

javascript - 简单的 PIN 验证

javascript - Angular RXJS 返回 3 个可观察流的数组

javascript - 按类别筛选 选择

android - picasso ,图像加载和调整大小

PHP/MySQL 性能

python - 在没有exec/eval,python的字符串中调用代码

javascript - 在 d3.js 中自动更新图表

c++ - std::vector 在设置大小时性能较低?

jquery - 在使用 eval 执行动态加载的 JavaScript 文件之前,jQuery 如何清理它们?

ruby - 我可以使用字符串作为可执行代码行的一部分吗?