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 并用其他东西替换吗?

4

6 回答 6

9

Instead of:

eval($.validator.format('Resources.message_{0}', functionResult))

just use:

Resources["message_" + functionResult]

All objects in JavaScript are really associative arrays (aka hashes), and the dot syntax (a.b) is just syntactic sugar for looking something up in the hash (a['b']). So you don't need eval at all; just build the key as a string, and look up your value using that key.

于 2010-10-25T01:13:16.127 回答
8

关联

在大多数情况下,eval 的使用就像大锤拍打苍蝇一样——它可以完成工作,但威力太大。它很慢,很笨重,而且当你犯错时往往会放大伤害。

于 2010-10-20T23:33:17.037 回答
5

它是邪恶的,因为它允许您将字符串作为代码执行,并且谁知道该字符串来自哪里或它包含什么。

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

于 2010-10-20T23:41:48.727 回答
3

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

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

于 2010-10-20T23:34:00.217 回答
3

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

于 2010-10-20T23:36:42.950 回答
2

I'm not entirely clear on what you're doing, but it looks like
$('#divPresenter').html(eval($.validator.format('Resources.message_{0}', functionResult)));
can be written as
$('#divPresenter').html(Resources["message_" + functionResult]);

于 2010-10-25T01:20:04.323 回答