Javascript 评估是一个邪恶的问题

Javascript 评估是一个邪恶的问题,javascript,eval,jslint,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。因

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

在大多数情况下,使用eval 就像大锤打苍蝇一样-- 它完成了任务,但也有太多的时间 大功率。速度慢,笨重, 而且当 你犯了一个错误


JS Lint结合了Douglas Crockford认为是JavaScript的最佳实践。他强烈反对使用的功能之一是
eval
。我相信他认为这是缓慢和不安全的


根据所讨论的代码,可能有许多潜在的替代方案。如果您想发布代码中使用eval的部分,我们可以提供更具体的建议。

如果您试图使用eval将字符串转换为JSON对象,可以尝试一个(我从未使用过它,但它看起来很合理)。

它很邪恶,因为它允许您将字符串作为代码执行,谁知道这个字符串来自哪里,或者它包含什么

是的,99.9%的情况下,有更好的选择(具体是什么取决于您使用的
eval
)。剩下的0.1%的时间,你真的别无选择,只能使用
eval
,在这种情况下,你需要非常谨慎。

而不是:

eval($.validator.format('Resources.message_{0}', functionResult))
只需使用:

Resources["message_" + functionResult]

JavaScript中的所有对象都是真正的关联数组(又称散列),点语法(
a.b
)只是在散列中查找内容的语法糖(
a['b']
)。所以你根本不需要
eval
;只需将键构建为字符串,并使用该键查找您的值。

我不完全清楚您在做什么,但它看起来像
$('#divPresenter').html(eval($.validator.format('Resources.message{0}',functionResult))
可以写成

$('#divPresenter').html(参考资料[“message”+functionResult])

您能提供如何使用
eval
的代码吗?如果JSLint提供一些关于抛出错误原因的详细信息,至少会很好。+1因为没有做出全面的断言
eval
goto
或函数的多次返回一样邪恶(即,只有误用时才邪恶)。从这个意义上说,餐具和锤子也是邪恶的:-)一个好的工匠理解并知道他的工具的局限性和危险性。这些人似乎不能安全地使用strcpy,而是使用strcpy等(顺便说一句,这很不安全),所以我不确定我是否会对他们的意见给予太多的重视:-)。如果您已经解析或以其他方式验证了字符串是安全的,那么eval并不是一个大问题。这就是我在回答中链接到的解析器的工作方式。为什么?也许因为“EVAL”是用一种较低级别的语言编写的,而不是JavaScript,通常是C或C++。我将要把这篇文章准确地贴出来,但我先去做了一个例子: