WithCoderWithCoderWithCoder

Javascript eval()函数

    今天在写PHP代码时,需要将服务端返回的对象JSON字符串在页面中转换为对象。刚开始使用的 JSON.parse() 方法,不过中间因为有个属性值中包含“\t”转义空白,导致方法出错。因为返回的字符串长度太大,刚开始怀疑是字符参数长度超出的问题,网络搜索折腾了一圈都没有解决问题。在这个过程中,看到js的 eval 函数也可以计算一个字符串,尝试这个方法后没有报错且返回了对象。虽然最后查到了出错原因,但之前没有太多关注eval函数,本文就此函数的使用简单介绍,以备后续使用。

    函数定义

    eval() 可以接受一个字符串string作为参数,并把这个参数作为脚本代码来执行。

    语法

eval(string)
参数描述
string必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。

    参数说明

    1. 如果参数是一个表达式,eval() 函数将执行表达式;

    2. 如果参数是Javascript语句,eval()将执行 Javascript 语句;

    3. 如果执行结果是一个值就返回,不是就返回undefined,如果参数不是一个字符串,则直接返回该参数。

    举例1,计算数组字符串:

<script>
    // eval计算字符串
    var str = '[{"id":"1","name":"zhangsan","age":100},{"id":"2","name":"lisi","age":80}]';
    var obj = eval(str);
    console.log(obj);
</script>

    以上代码将输出一个数组对象:

    1-200HG14514I5.png

    举例2,计算函数字符串:

<script>
    // eval生成函数
    var f;
    var strf = 'f = function(){alert("hello world");};'
    eval(strf);
    // 调用函数
    f();
</script>

    以上代码将执行函数 f,并在页面弹出提示框“hello world”。

    举例3,计算对象直接量字符串:

<script>
    // eval计算对象直接量
    var str = '{"id":"1","name":"zhangsan","age":100}';
    var r = eval(str);
    console.log(r);
</script>

    执行以上代码,会抛出错误“Uncaught SyntaxError: Unexpected token :”。这是因为,在使用eval来解析JSON格式字符串的时候,会将“{}”解析为代码块,而不是对象的字面量。要解决错误,可以使用以下两种方式:

    1. 在JSON格式的字符串前面拼接上 "var o =";
    2. 把JSON格式的字符串使用()括起来,就不会将{}解析为代码块,而是表达式。

    修改代码如下:   

<script>
    // eval计算对象直接量
    // var str = '{"id":"1","name":"zhangsan","age":100}'; // 这样使用,计算会出错

    // 1.
    var str1 = 'var o = {"id":"1","name":"zhangsan","age":100}'; // 在JSON格式的字符串前面拼接上变量
    eval(str1); // 返回undefined
    console.log(o);

    // 2.
    var str2 = '({"id":"1","name":"zhangsan","age":100})'; // 把JSON格式的字符串使用()括起来
    var r = eval(str2);
    console.log(r);
</script>

     以上代码将各自输出一个对象直接量,如下图:

    1-200HG1594JF.png

    eval函数作用域

    eval()函数并不会创建一个新的作用域,并且它的作用域就是它所在的作用域,计算使用的上下文就在当前的作用域。不过,有时候需要将eval()函数的作用域设置为全局,这个时候可以用window.eval()的方式实现。

欢迎分享交流,转载请注明出处:WithCoder » Javascript eval()函数