eval做什么,为什么它邪恶? [重复]

问题描述 投票:3回答:2

此问题已经在这里有了答案:

var myString = "x",
    myObject = {
        x: 10
    },
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);

eval is evil

我已经在互联网上阅读过有关eval()函数的信息,但是除了“ 它评估一个表达式”之外,我还无法真正掌握它的实际作用。

我们应该仅将eval()函数用于数字值吗?

javascript eval
2个回答
14
投票

[eval()接受给出的字符串,然后像对待纯JavaScript代码一样运行它。

被认为是“邪恶的,因为:

  • 它使事情变得过于复杂-在大多数情况下,使用eval()时,会有一种更简单的解决方案,不需要它。问题中的这个例子就是一个很好的例子:绝对不需要eval()这样的表达式。 JS具有很好的语法,可以将对象属性名称引用为字符串(myObject["x"]myObject.x相同)。

  • 调试起来要困难得多–在调试器中使用它变得更加困难,即使您设法弄清了正在发生的事情,您也需​​要做更多的工作,因为您必须同时调试两个评估的代码,以及将原始字符串生成为eval的代码。

  • 这会减慢速度-脚本编译器无法在eval()中预编译代码,因为在到达那里之前,它不知道代码将包含什么。因此,您会失去现代Javascript引擎的一些性能优势。

  • 这是黑客的梦想- eval()将字符串作为代码运行。黑客之所以喜欢它,是因为将字符串注入程序比注入代码容易得多。但是eval()表示您可以插入一个字符串,并使它作为代码运行。因此,eval()使您的代码更容易被黑客入侵。 (对于基于浏览器的Javascript而言,与其他语言相比,这不是一个大问题,因为无论如何在浏览器中都可以访问JS代码,因此您的安全模型不应基于您的代码是不变的,但是尽管如此,注入黑客仍然可能是一个问题,尤其是跨站点攻击时。)


6
投票

在这种情况下,只需使用myObject[myString]

eval被严重滥用。我发现它唯一有效的用途就是在较旧的浏览器中解析JSON。

© www.soinside.com 2019 - 2024. All rights reserved.