js的eval函数解析后台返回的json数据时为什加上圆括号eval("("+data+")"),而HTML页面定义的数据不用

时间:2022-04-14 05:33:13

一,情况如下,这是成功代码:

       $(function () {
$.ajax({
url: "Demo.aspx",
type: "post",
data: { Id: "" },
success: function (data) {
var obj1 = eval("(" + data + ")");
alert(obj1[0].ProductClass_ID);
}
});
})

然而如果将var obj1 = eval("(" + data + ")");,改为 var obj1 = eval(data);,就是出现弹出undefined,这是什么原因呢?

二,但是在HTML定义的却毫无问题,代码如下:

      $(function () {
var person = {
"name": "Nicholas",
"age": ""
};
var obj = eval(person);
alert(obj.name);
})

三,经过百度发现:

原因在于:

1,eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
2,加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。

那上面这两句话怎么理解?

四,经过用调试,发现如图

1,在HTML页面定义的数据

js的eval函数解析后台返回的json数据时为什加上圆括号eval("("+data+")"),而HTML页面定义的数据不用

2,经过异步返回的数据

js的eval函数解析后台返回的json数据时为什加上圆括号eval("("+data+")"),而HTML页面定义的数据不用

由上面数据的对比得出结论:

1,在HTML页面写的定义的数据本身就是属于一个object对象

2,在异步之后的数据是语句(statement),而如果执行这个就会出现undefined错误,所以我们需要将括号内的强制转化为对象执行,就是以上这句话var obj1 = eval("(" + data + ")");

3,和这两句例子一样

alert(eval("{}")); // 放回undefined

alert(eval("({})")); //返回 object[Object]