使用JSlint验证我的javascript。
我收到一个错误,说eval是邪恶的!为什么这是我可以使用的替代品?
以下是我使用eval的示例,并希望为其提供解决方法。
我有一个这样的数组:
var Resources = {
message_1: 'Message 1',
message_2: 'Message 2',
message_3: 'Message 3',
message_4: 'Message 4'
};
我有一个函数(functionResult),返回一个数字,1,2,3或4.所以我想在下面的代码行中做的是获取数组中的资源,结果中的消息结束我的职能。
$('#divPresenter').html(eval($.validator.format('Resources.message_{0}', functionResult)));
我有什么想法可以删除eval并替换其他内容吗?
答案 0 :(得分:9)
而不是:
eval($.validator.format('Resources.message_{0}', functionResult))
只需使用:
Resources["message_" + functionResult]
JavaScript中的所有对象都是关联数组(也称为哈希),点语法(a.b
)只是用于在哈希(a['b']
)中查找内容的语法糖。所以你根本不需要eval
;只需将密钥构建为字符串,然后使用该密钥查找您的值。
答案 1 :(得分:8)
http://blogs.msdn.com/b/ericlippert/archive/2003/11/01/53329.aspx
在大多数情况下,使用eval 就像一把围着一只苍蝇的大锤 - 它完成了工作,但也有 很有力量。它很慢,很笨重, 并倾向于放大损害时 你犯了一个错误。
答案 2 :(得分:5)
这是邪恶的,因为它允许你执行一个字符串作为代码,谁知道该字符串的来源或它包含的内容。
是的,99.9%的情况下,有更好的选择(这些取决于你使用eval
的内容)。剩余的0.1%的时间,你真的别无选择,只能使用eval
,在这种情况下,你需要非常谨慎。
答案 3 :(得分:3)
JS Lint结合了道格拉斯·克罗克福德认为是JavaScript的最佳实践。他强烈反对使用的功能之一是eval
。我相信他认为这是缓慢和不安全的。
根据相关代码,可能有许多潜在的替代方案。如果您要发布使用eval
的代码部分,我们可以提供更具体的建议。
答案 4 :(得分:3)
如果您尝试使用eval将字符串转换为JSON对象,可以尝试JSON parser lib(我从未使用过它,但看起来很合理)。
答案 5 :(得分:2)
我不清楚你在做什么,但它看起来像是
$('#divPresenter').html(eval($.validator.format('Resources.message_{0}', functionResult)));
可以写为
$('#divPresenter').html(Resources["message_" + functionResult]);