埃瓦尔做了什么,为什么它是邪恶的
what does eval do and why its evil?
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'd 代码和生成原始字符串的代码。
-
它减慢了速度 - 脚本编译器无法在
eval()
中预编译代码,因为它不知道代码将包含什么,直到它到达那里。因此,您将失去现代Javascript引擎中的一些性能优势。 -
这是黑客的梦想 -
eval()
运行字符串作为代码。黑客喜欢这个,因为将字符串注入程序比注入代码容易得多;但eval()
意味着您可以注入一个字符串,并让它作为代码运行。因此,eval()
使您的代码更容易被破解。(与其他语言相比,对于基于浏览器的Javascript来说,这不是一个问题,因为JS代码无论如何都可以在浏览器中访问,所以你的安全模型不应该基于你的代码是不可变的,但是,注入黑客仍然是一个问题,特别是跨站点攻击(。
在这种情况下,只需使用 myObject[myString]
.
eval
被可怕的滥用。我发现它的唯一有效用途是在旧浏览器中解析 JSON。
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 为什么“;未定义的“;在JavaScript中结束循环
- 为什么这在IE中的工作方式与在Firefox中不同
- 知道为什么我的旋转木马不会自动更改图片吗
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 为什么在变形之前不缺少Fx
- 为什么JavaScript在for循环为3时向所有4发出警报
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- 为什么Airbnb风格指南说不鼓励依赖函数名称推断
- 为什么要使用0>javascript中的0
- 为什么无法在TypeScript中导出类实例
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 为什么我的d3.jsselectAll+过滤器没有过滤
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- 为什么忽略了eval()代码中的语法错误
- 为什么在画布上画线;t出现
- 为什么js事件消失了
- 埃瓦尔做了什么,为什么它是邪恶的
- 需要一个HTML框架的替代品(我现在知道为什么它们是邪恶的)