此问题已经在这里有了答案:
var myString = "x",
myObject = {
x: 10
},
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);
我已经在互联网上阅读过有关eval()函数的信息,但是除了“ 它评估一个表达式”之外,我还无法真正掌握它的实际作用。
我们应该仅将eval()函数用于数字值吗?
[eval()
接受给出的字符串,然后像对待纯JavaScript代码一样运行它。
被认为是“邪恶的,因为:
它使事情变得过于复杂-在大多数情况下,使用eval()
时,会有一种更简单的解决方案,不需要它。问题中的这个例子就是一个很好的例子:绝对不需要eval()
这样的表达式。 JS具有很好的语法,可以将对象属性名称引用为字符串(myObject["x"]
与myObject.x
相同)。
调试起来要困难得多–在调试器中使用它变得更加困难,即使您设法弄清了正在发生的事情,您也需要做更多的工作,因为您必须同时调试两个评估的代码,以及将原始字符串生成为eval的代码。
这会减慢速度-脚本编译器无法在eval()
中预编译代码,因为在到达那里之前,它不知道代码将包含什么。因此,您会失去现代Javascript引擎的一些性能优势。
这是黑客的梦想- eval()
将字符串作为代码运行。黑客之所以喜欢它,是因为将字符串注入程序比注入代码容易得多。但是eval()
表示您可以插入一个字符串,并使它作为代码运行。因此,eval()
使您的代码更容易被黑客入侵。 (对于基于浏览器的Javascript而言,与其他语言相比,这不是一个大问题,因为无论如何在浏览器中都可以访问JS代码,因此您的安全模型不应基于您的代码是不变的,但是尽管如此,注入黑客仍然可能是一个问题,尤其是跨站点攻击时。)
在这种情况下,只需使用myObject[myString]
。
eval
被严重滥用。我发现它唯一有效的用途就是在较旧的浏览器中解析JSON。