javascript之eval函数的一些常见问题以及处理方法

W3C对EVAL函数的解释是

eval()函数:可计算某个字符串,并执行其中的JavaScript代码。

eval( String );

当我们用的eval拿到了一个服务器传来的一些数据的时候(当然,我们通常会用JSON.parse()来去拿这个数据),

假如,数据里存放的是一个JS对象字面量代码块

//假如服务器传来的数据,是存放到str里的这些
var str = "{name:'test',age:23}";
var o = eval(str);
console.log(o);
//打印结果:Uncaught SyntaxError: Unexpected token :

意思是:语法错误,不期望的标记:
 

将代码进行修改后:

//假如服务器传来的数据,是存放到str里的这些
var str = "{name:'test'}";//这里进行了修改,去除了",age:23"
var o = eval(str);
console.log(o);
//打印结果:test

为什么会有这样的结果呢?

原因很简单,EVAL里面传入的是字符串,这一点毋庸置疑,但是当的JavaScript解释器去解析这段字符串的时候,它并没有将花括号当做对象字面量去解释,而是当做了代码块。因此相当于给变量o返回了一个“name:'test'”这个东西。

但是,最终的打印结果是试验,这又是为什么呢?下面为大家放上一些代码做解释,

//在JS里,如果有 " 标识符:xxx " 或者"标识符:for(){}" 这种语法的出现,那么它相当于一种标记,
//表示其后的代码所处在的一个位置的名称,与其他语言中goto的语法有些相近

//例如,寻找其二维数组中 7 所在的位置。
        var arr = [
            [1, 2, 3, 4],
            [5, 6, 7, 8],
            [9, 10, 11, 12]
        ];
        //这里有个begin的标识
        begin:for (var i = 0; i < arr.length; i++) {
            for (var j = 0; j < arr[i].length; j++) {
                if (arr[i][j] === 7) {
                    console.log(i+1 + ' ' + (j+1));
                    //表示,跳转到begin执行后的位置,
                    break begin;
                }
            }
        } }
        }

好的,现在大家应该知道了,其实,名称:'test'只是一个标记后面跟了一个字符串而已,最终传给o的是字符串的部分。

解决方法:

当我们在给EVAL传入字符串的时候,如果传入的是一个对象字面量的形式,那么可以在花括号的外面套上一层圆括号,具体的实现如下代码:

var str = "({name:'test,age:23'})";
var o = eval(str);
console.log(o);
//chrome浏览器中打印结果:{name: "test,age:23"}

此时,JS在解析的过程中,就不会将{}当做代码块来解析了,而是当做了对象字面量。

感谢您的留言批正

你可能感兴趣的:(对javascript的理解)