我看到很多关于如何像这样动态添加代码的建议 (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
因此,不使用 eval
的原因仅与安全相关。来自 Why is using the JavaScript eval function a bad idea? 上接受的答案:
- Improper use of eval opens up your code for injection attacks
- Debugging can be more challenging (no line numbers, etc.)
还有第三个是讲速度的,但是在那个回答的评论里反驳了。如果你不能保证你计划的脚本来源eval
,应该避免。
顺便说一句:根据问题末尾的使用模式,您可能需要查看 require.js用于动态加载脚本。
关于javascript - 与使用 eval 相比,包含 <script> 标签是否有性能提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8380204/