是否有充分的理由使用eval()?

时间:2009-12-01 15:19:11

标签: eval

在我看来,eval()的处理方式与goto相同。通过eval,我的意思是一个用于执行字符串作为代码的函数,如PHP,Python,JavaScript等所示。是否存在使用eval()是合理的情况(除了perl)?如果没有,为什么这么多语言实现它呢?

11 个答案:

答案 0 :(得分:25)

是 - 当没有其他方法以合理的清晰度和合理数量的代码行完成给定任务时。

这消除了99%的使用eval的案例,在所有语言和背景下全面使用。

答案 1 :(得分:9)

在动态生成代码的情况下,eval通常是最便捷的解决方案。即使在没有正式支持eval的语言(例如Java)中,它们也支持在运行时类似的反射和修改类。 (参见诸如Stu Halloway的Component Development for the Java Platform

等书籍

答案 2 :(得分:4)

一个合理的用法是,如果你有一种解释性的语言,你已经建立在另一种语言之上,但你仍然希望提供某种“逃避舱口”,以允许人们回到由其提供的功能。基础语言。一个例子是在Lisp中实现Prolog,然后定义一个允许通过EVAL直接使用Lisp函数的谓词。

答案 3 :(得分:3)

对于快速黑客攻击,没有问题,因为它是一个方便的快速出击。

在生产代码中,将其视为最后的手段 - 即便如此,尝试其他方法 - 因为eval很难控制,因而很危险。对于任何非平凡的事情,都要实现一个子语言。

答案 4 :(得分:3)

我在测试网站时使用过一次 - 我们编写了一个小的PHP脚本,可以动态解密并执行来自未记录的HTTP数据源的加密签名的有效负载。到目前为止,这是我见过的最好的eval()。

(换句话说:不,我从未见过很好地使用eval)

答案 5 :(得分:2)

反手思想:eval对于实现一个穷人的表达式编译器或类似的东西很有用。它也是卫生宏的枯燥,生锈的替代品。

答案 6 :(得分:2)

也许我过度使用shperl,但我从未见过有人以goto的蔑视来对待eval

所以我的回答是:'eval适用于撰写perl 5sh'时。阻止evaltry中的主要catch / Perl机制,如果没有它,很难编写安全代码。

答案 7 :(得分:1)

写一个很酷的教科书示例,说明在X语言中实现“计算器”是多么容易? =)

答案 8 :(得分:0)

在以正确的方式实施之前调试/测试一个想法。

例如,你正在制作玩具计算器,并且你想首先使用gui,所以你只需使用eval在后​​台进行“后端”工作。稍后,您回到后端,从eval开始,并编写一个正确的表达式解析器。

答案 9 :(得分:0)

创建/测试代码段时,eval是完美的!

使用textareas和eval按钮构建一个基本的脚手架网页。 将代码放入textarea然后按eval按钮。它比在文本编辑器和浏览器之间来回切换更快

EVAL

edit code
press eval button

切换方法

edit code
press save          extra step
switch to browser   extra step
press reload

在对代码进行大量测试和调整时,可以添加一些额外的小步骤。另外,您可能会忘记在测试时避免造成混淆。

答案 10 :(得分:0)

当您需要生成&#39>时使用Eval。并执行代码。通过生成我的意思是包括来自外部来源(文件,网站,代理商)以及在程序内动态创建。

除了外部模块和评估网站的明显示例之外,您希望生成代码的原因通常是在代码中动态引用对象和属性的名称。

第一个例子,btw,已经在加载HTML页面并且具有脚本标记时发生,或者在HTML标记的事件处理程序属性中发生 - 所以从一开始Web开发人员就利用了EVAL,即使它是浏览器拨打电话。

这间接带给我第二个原因 - 访问对象的名称..在某些语言(如java)中,内省的能力减少或消除了使用java的eval的需要。事实证明,由于Javascript中的对象是完全动态的,因此Javascript中的属性访问与其他语言中的内省相当,您可以在其中访问和引用动态创建的名称。此外,Javascript还有#39;来电和'申请'函数用它们的参数动态调用函数。

最后,与执行代码有关,可以使用eval来提高性能 - 而不是确定要运行哪个代码或使用哪个对象的多级条件或属性访问,可以创建一个可能具有的最小代码片段执行数十万次,将其评估为函数,然后调用该函数。这可能适用于多方法,例如,一旦确定了使用的特定参数。但是,当然,由于javascript将函数视为第一类对象,因此这只是原因之一。