Javascript Eval是邪恶的,但只在某些情况下?

问题描述:

可能重复:
When is JavaScript's eval() not evil?Javascript Eval是邪恶的,但只在某些情况下?

我想知道,

除了Eval再次启动的解释,引起开销,

的唯一情况,就是它可能很糟糕(除了我刚刚写的东西十),是JS向服务器发送数据(即eval'd)。

我没有看到任何其他场景,如果用户想要玩js,他只能在他的浏览器边界(除非JS与服务器交互)进行游戏。

对吗?

我很乐意进行更正。

+0

@canon我已经读过,仍然没有找到答案。 (除了我忘记提及调试问题) – 2012-07-20 20:40:11

+0

http://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/,http://berniesumption.com/software/eval -considered-useful/ – Blaster 2012-07-20 20:41:49

+0

如果你说明你为什么要使用eval,它会更有效。然后我们可以评估这是一个好主意。当然,除非你在理论上提出... – 2012-07-20 20:45:15

严格来说,实际上并没有什么东西在使用eval时会产生有害的影响,因为它只不过是浏览器的控制台已经可以做的事。

存在潜在的注射危险,但这与将任何用户提供的输入放入<script>标记中相同,而不是eval的特殊性。

避免eval的主要原因是因为它必须解释一个字符串。现在,公平地说,仅仅运行一个JavaScript文件就像在整个文件(广义地说)上调用一个伟大的大文件eval一样,因为JavaScript被解释(或者至多在运行时被编译)。因此,使用eval稀疏,只有在用户点击按钮时才会运行,这很好。只有当您经常运行eval(例如循环)时才会出现明显的效果。这就是为什么人们总是会告诉你传递一个函数到setTimeout而不是一个字符串,例如。

也就是说,有总是替代使用eval。它可能需要重写旧代码的一部分,但始终可以避免。

+0

什么是“只有用户沙箱”,“只有当客户端与服务器通话时才会受到伤害” – 2012-07-20 20:48:00

+0

“eval”不会比浏览器的控制台造成的伤害更大。例如,由于控制台无法删除计算机上的文件,因此无法“评估”。但是我的控制台可以与服务器(AJAX,XSS等)通信,但这只是一个问题,如果糟糕的'eval'进入其他人的计算机 - 只有在您将用户提供的内容注入其他人的页面时才会这样做如与论坛) – 2012-07-20 20:49:45

+0

“实际上没有什么,在使用'eval'身体有害'”......好吧,技术上只有0。00001%左右的代码是“物理上有害的”,所以在这个意义上你是正确的:-)然而,你认为'eval'有一个性能成本是错误的(细节是根据代码和浏览器)。你可以使用/不使用'eval'来运行完全相同的代码,并且看到它使用'eval'执行得更慢,所以从这个意义上来说* *实际上对eval有害。 – machineghost 2012-07-20 21:01:18