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

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

       $(function () {
            $.ajax({
                url: "Demo.aspx",
                type: "post",
                data: { Id: "1" },
                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": "29"
            };
            var obj = eval(person);
            alert(obj.name);
        }) 

三,经过百度发现:

原因在于:

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

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

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

1,在HTML页面定义的数据

2,经过异步返回的数据

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

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

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

3,和这两句例子一样

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

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

原文地址:https://www.cnblogs.com/May-day/p/6124848.html