语法
eval(string)
参数
- 一串表示JavaScript表达式,语句, 或者是一系列语句的字符串。表达式可以包括变量以及已存在对象的属性。
string
返回值
执行指定代码之后的返回值。如果返回值为空,返回undefined
描述
eval()是全局对象的一个函数属性。
eval()
的参数是一个字符串。如果字符串表示的是表达式,eval()会对表达式进行求值。如果参数表示一个或多个JavaScript语句, 那么eval()就会执行这些语句。注意不要用eval()来执行一个四则运算表达式;因为 JavaScript 会自动为四则运算求值并不需要用eval来包裹。
如果要将算数表达式构造成为一个字符串,你可以用eval()在随后对其求值。比如,假如你有一个变量 x ,你可以通过一个字符串表达式来对涉及x的表达式延迟求值,将 "3 * x + 2
",存储为变量,然后在你的脚本后面的一个地方调用eval()。
如果eval()的参数不是字符串,
eval()将会将参数原封不动的返回。
在下面的例子中,字符串构造器被指定,eval()返回了字符串对象而不是对字符串求值。
eval(new String("2 + 2")); // 返回了包含"2 + 2"的字符串对象
eval("2 + 2"); // returns 4
你可以使用通用的的方法来绕过这个限制,如使用toString()
var expression = new String("2 + 2");
eval(expression.toString());
如果你间接的使用 eval(), 如通过一个引用来调用它而不是直接的调用eval。 从ECMAScript 5起它工作在全局作用域而不是局部作用域中;这就意味着,例如,下面的代码的作用声明创建一个全局函数,并且geval中的这些代码在执行期间不能在被调用的作用域中访问局部变量。
function test() {
var x = 2, y = 4;
console.log(eval("x + y")); // 直接调用,使用本地作用域,结果是 6
var geval = eval;
console.log(geval("x + y")); // 间接调用,使用全局作用域,throws ReferenceError 因为`x`未定义
}
eval函数解析json数据时为什加上圆括号eval("("+data+")")
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。
举一个例子,例如对象字面量{},如若不加外层的括号,
那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
例如下面这段代码:
var et = eval('(6)'); console.log('et='+et);这里输出 et=6var et1 = eval('({name:"tom",sex:"female"})'); console.log('et1='+et1);这里输出 e=[object Object] 两个例子对照看,即可明白 eval("("+data+")")的原因