是否有任何理由使用动态创建的脚本来执行解决方案?标记而不是eval()
Is there any reason to do a solution using a dynamically created <script> tag instead of eval()?
在JavaScript中避免eval()函数有一些很好的理由,即在eval()代码中包含用户输入时存在安全风险。然而,在eval()代码不包含任何受用户输入影响的情况下(在我的特殊情况下,我们在XML文件中定义了动态模板—这些模板还可以指定复杂的验证函数,嵌入在XML中的javascript代码,然后由客户端通过AJAX接收),有什么理由避免eval()函数吗?
我想到了一个解决方案(我可能不是第一个,但我没有见过这样做),使用动态创建的内联标签代替eval():
$(scriptObject).text(strJSCode);
在http://jsfiddle.net/H7EG9/1/可以看到一个简单的示例(我知道这个示例确实使用了用户输入,但这只是为了便于演示)。
有什么理由这样做而不是eval()吗?结果基本上是一样的,尽管对于eval()的死敌来说,这个选项可能看起来不那么"可怕"。
我将使用eval
而不是创建脚本标记。
脚本标记会产生开销(它们是DOM元素),但更重要的是,您需要使用某种全局变量来访问脚本标记中的脚本。如果使用eval,可以简单地执行
var evalFunction = eval("(function(){...})"); // wrap function in () to make it an expression
var result = evalFunction(val);
IE8及以下版本不允许以data:
格式提供脚本。在这方面,eval()
更可靠。
话虽这么说,如果你正在使用AJAX下载一个JS文件,从中你得到的字符串,你可以只是设置scriptObject.src = 'path/to/script.js';
浏览器将有缓存中的文件,因此将立即加载它。
eval很容易编写,但在标题或正文中添加一个脚本元素并将js文本附加到新脚本元素中几乎同样容易。有些极端情况,比如变量提升,在执行脚本时表现得有点奇怪。
相关文章:
- 可以转换显示属性吗?如果没有,什么'这是最好的解决方案
- iPad虚拟键盘-哪一个-javasctript解决方案
- AJAX HTTP基本身份验证解决方案
- 在chrome web商店中打开时,是否有允许执行内容/后台脚本的解决方案
- Chart.js-添加渐变而不是纯色-实现解决方案
- learnyounode杂耍异步解决方案不工作
- 了解因子分解解决方案
- 提交表单后的最佳解决方案
- 计时器在使用 jQuery 一分钟后没有触发,或者每 1 分钟后给出一些其他解决方案来触发功能
- chrome中的意外全局变量有解决方案吗
- 更好的解决方案HTML元素幻灯片从右侧CSS转换
- 使用SeleniumWebdriver将文本复制到文件时出现编译错误的解决方案
- 如何让我的网站上的WEBP图像加载在morzilla firefox中有一个可能的解决方案吗?如果是,那么如何
- JS驱动的常见问题页面的推荐DB解决方案
- 这里有一个更优雅的/DRY/可维护的JS解决方案
- 什么是农民最实用的解决方案;印刷动物”;
- 根据某些条件验证用户输入,而不是将输入输入到数组中,需要最基本的解决方案
- 将数据加载到地图上的更好解决方案
- 是否有任何理由使用动态创建的脚本来执行解决方案?标记而不是eval()
- iMacros w EVAL([javascript]} FORMAT尝试时出现错误,没有解决方案