eval做了什么以及为什么它的邪恶?

the*_*ava 3 javascript eval

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

http://jslinterrors.com/eval-is-evil/

我一直在阅读关于互联网上的eval()函数,但除了" 它评估一个表达式 " 之外,无法真正掌握它的实际功能.

我们应该只为数值使用eval()函数吗?

Spu*_*ley 14

eval() 获取给定的字符串,并将其作为纯JavaScript代码运行.

它被认为是"邪恶的",因为:

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

  • 调试起来要困难得多 -在调试器中使用它很难,甚至一旦你设法解决了正在发生的事情,你就需要做额外的工作,因为你必须调试eval'd代码和生成原始字符串到eval的代码.

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

  • 这是一个黑客的梦想 - eval()作为代码运行一个字符串.黑客喜欢这个,因为将一个字符串注入程序要比注入代码要容易得多; 但eval()意味着你可以注入一个字符串,并让它作为代码运行.因此eval(),您的代码更容易破解.(对于基于浏览器的Javascript而言,这比其他语言更少,因为无论如何都可以在浏览器中访问JS代码,因此您的安全模型不应该基于您的代码是不可变的,但是,注入黑客仍然可能是一个问题特别是对于跨站点攻击).


Nie*_*sol 6

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

eval被可怕地误用了.我发现它的唯一有效用途是在旧版浏览器中解析JSON.