var myString = "x",
myObject = {
x: 10
},
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);
我一直在互联网上阅读有关 eval() 函数的信息,但除了“它评估一个表达式”之外,我无法真正掌握它的实际作用。
我们应该只对数值使用 eval() 函数吗?
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 的代码。
它减慢了速度 -脚本编译器无法预编译 a 中的代码eval()
,因为它不知道代码将包含什么,直到它到达那里。因此,您失去了现代 Javascript 引擎的一些性能优势。
这是黑客的梦想—— eval()
将字符串作为代码运行。黑客喜欢这个,因为将字符串注入程序比注入代码要容易得多。但eval()
意味着您可以注入一个字符串,并让它作为代码运行。所以eval()
让你的代码更容易被破解。(对于基于浏览器的 Javascript 而言,这比其他语言的问题要小,因为 JS 代码无论如何都可以在浏览器中访问,因此您的安全模型不应基于您的代码是不可变的,但是尽管如此,注入黑客仍然可能是一个问题,尤其是跨站点攻击)。
在这种情况下,只需使用myObject[myString]
.
eval
被严重滥用。我发现它的唯一有效用途是在旧浏览器中解析 JSON。