有一些很好的理由可以避免JavaScript中的eval()函数,即在eval()代码中包含用户输入时的安全风险。但是,在eval()代码不包含任何受用户输入影响的情况下(在我的特定情况下,我们在XML文件中定义了动态模板 - 这些模板也可以指定复杂的验证函数,嵌入在XML,然后客户端通过AJAX接收,有没有理由避免使用eval()函数?
我想出了一个使用动态创建的内联标记而不是eval()的解决方案(我可能不是第一个,但我没有看到这个完成):
$(scriptObject).text(strJSCode);
一个简单的例子可以在 http://jsfiddle.net/H7EG9/1/ 看到(我知道这个例子确实使用用户输入,但这只是为了让它易于演示)。
有没有理由这样做而不是eval()?结果基本相同,虽然这个选项可能对eval()的顽固敌人来说不那么“可怕”。
答案 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)