是否有任何理由使用动态创建的<script>标记而不是eval()?</script>来执行解决方案

时间:2013-03-06 22:22:24

标签: javascript jquery

有一些很好的理由可以避免JavaScript中的eval()函数,即在eval()代码中包含用户输入时的安全风险。但是,在eval()代码不包含任何受用户输入影响的情况下(在我的特定情况下,我们在XML文件中定义了动态模板 - 这些模板也可以指定复杂的验证函数,嵌入在XML,然后客户端通过AJAX接收,有没有理由避免使用eval()函数?

我想出了一个使用动态创建的内联标记而不是eval()的解决方案(我可能不是第一个,但我没有看到这个完成):

$(scriptObject).text(strJSCode);

一个简单的例子可以在 http://jsfiddle.net/H7EG9/1/ 看到(我知道这个例子确实使用用户输入,但这只是为了让它易于演示)。

有没有理由这样做而不是eval()?结果基本相同,虽然这个选项可能对eval()的顽固敌人来说不那么“可怕”。

3 个答案:

答案 0 :(得分:1)

我会使用eval而不是创建脚本标记。

脚本标记创建开销(它们是DOM元素)但更重要的是,您需要使用某种全局变量来访问脚本标记中的脚本。如果你使用eval,你可以简单地做

var evalFunction = eval("(function(){...})"); // wrap function in () to make it an expression
var result = evalFunction(val);

答案 1 :(得分:0)

IE8及更低版本不允许以data:格式提供脚本。在这方面,eval()更可靠。

话虽如此,如果你使用AJAX下载一个JS文件,你可以从中获取该字符串,你可以设置scriptObject.src = 'path/to/script.js';浏览器将文件放在缓存中,因此会立即加载它。 / p>

答案 2 :(得分:0)

eval易于编写,但将脚本元素添加到头部或主体并将js文本附加到新的脚本元素几乎一样容易。在评估脚本时,一些边缘情况(如变量提升)表现得有些奇怪。