eval是邪恶的问题

时间:2010-10-20 23:31:25

标签: javascript eval jslint

使用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并替换其他内容吗?

6 个答案:

答案 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]);