eval()是全局对象的一个函数属性

eval() 的参数是一个字符串。如果字符串表示的是表达式, eval() 会对表达式进行求值。如果参数表示一个或多个JavaScript语句, 那么 eval()就 会执行这些语句。注意不要用 eval() 来执行一个四则运算表达式;因为 JavaScript 会自动为四则运算求值并不需要用eval来包裹。

这里的四则运算是指数学上的运算,如:3 + 4 * 4 / 6。注意这里面并没有变量,只是单纯的数学运算,这样的运算式并不需要调用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=6

var et1 = eval('({name:"tom",sex:"female"})');
console.log('et1='+et1);
这里输出 e=[object Object] 两个例子对照看,即可明白 eval("("+data+")")的原因


由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐地流行起来,进而出现的问题是如何将服务器端构建好的JSON数据转化为可用的JavaScript对象。利用eval函数无疑是一种简单而直接的方法。在转化的时候需要将JSON字符串的外面包装一层圆括号:var jsonObject = eval("(" + jsonFormat + ")");为什么要加括号?加上圆括号... 其实即便带有变量,JavaScript也是可以直接计算的,但是如果你现在只想声明一个带有变量的表达式,但是想稍后进行运算(你有可能在声明这个带有变量的运算式之后还有可能对里面的变量进行修改),就可以使用eval。比如,假如你有一个变量 x ,你可以通过一个字符串表达式来对涉及x的表达式延迟求值,将 “3 * x + 2”,存储为变量,然后在你的脚本后面的一个地方调用eval()。eval()的运行效率也普遍的比其他的替代方案慢,因为他会调用js解析器,即便现代的JS引擎已经对此做了优化。 文章目录eval()函数一、eval()基础用法二、eval()通过调用函数名调用函数三、eval()调用需要传参的函数四、eval()函数的其他用法1、eval(解析代码体)2、将作用域传入eval()也是可以识别的总结 eval()函数 定义:eval()函数是一种接受字符串作为参数,并且可以将接受的字符串转换成js表达式并且立即执行该表达式。 eval()函数的参数只有一个就是字符串。 eval(str) 例如:eval(‘console.log(112233)’) 他就可以将console.lo eval()表达式只有一个参数.如果传入的参数不是字符串,怎么返回值是它本身.如果传入的是字符串,怎么返回的是字符串最后一个表达式的计算值.最重要的是eval()表达式和函数调用一样.会有一个作用域链.先从第一对象开始寻找. 全局eval()当通过var geval = eval;别名调用时,这是调用全局eval.改变的是全局变量. 直接调用时,是作用域内的. typeof运算符返回值是操作数类型的 eval的用法eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句,下面给出eval解析json的示例 先来说eval的用法,内容比较简单,熟悉的可以跳过 eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。 需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才 eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。 需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下: 代码如下: var code1='"a" + 2'; //表达式 varcode2='{a:2}'; //语句 alert... eval函数返回值根据参数不同分为两种情况: 一:eval函数会评估给定的含有Javascript代码的字符串参数,并试图去执行包含在字符串里的表达式或一些列合法的 Javascript语句。 eval函数将把最后一个表达式或语句所包含的值或引用作为返回值。 (1)eval评估JavaScript表达式 var bar = 'bar'; var foobar = eva 定义和用法 eval() 函数可计算某个字符串,并执行其的的 JavaScript 代码。 语法 eval(string) 参数 描述 string 必需。要计算的字符串,其含有要计算的 JavaScript 表达式或要执行的 JavaScript eval() 函数详解 eval()函数用于计算并执行以字符串表示的JavaScript代码。eval()函数使JS可以动态执行JavaScript源代码。eval()函数属于Global对象,所有主流浏览器均支持该函数。 语法eval( code ) 参数参数 描述 如果参数codeJavaScript代码不合法,将会引发异常。返回值:eval()函数