Javascript 评估是一个邪恶的问题
使用JSlint验证我的javascript 我在说eval是邪恶的时候出错了!为什么会这样?我有没有其他选择 下面是我使用eval的一个例子,我希望有一个解决方法 我有这样一个数组: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。因
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++。我将要把这篇文章准确地贴出来,但我先去做了一个例子: