zoukankan      html  css  js  c++  java
  • js中的eval方法详解(一)–eval方法的初级应用

    在我看来,js中的eval()方法就是一个js语言的执行器,它能把其中的参数按照JavaScript语法进行解析并执行。

    语法:

    eval(s);
    1
    eval()方法中的参数s有多种情况。参数的不同形式,会使eval()方法执行的结果和返回值有差别。下面来说说他们的区别。

    eval()方法的参数形式
    如果参数s不是字符串,而是整数或者是Function类型,则直接返回该整数或Function

    举个栗子

    例1:

    var x = 1;
    var y = eval(x);//eval()方法返回1
    var z = eval(1)//eval()方法返回1

    例2:

    var f = eval(
    function(){
    console.log("1111");
    return 1
    }
    );
    /*
    eval()方法返回:
    function(){console.log("1111");return 1;}方法
    */
    var s = f();//执行方法 s=1,打印日志"1111"


    /**>>>>>>>>>>>>>>>**/

    var ff = function(){
    console.log("1111");
    return 1;
    };
    var f = eval(ff);//eval()方法返回ff方法
    var s = ff();//执行ff方法 s=1,打印日志"1111"

    /**>>>>>>>>>>>>>>>**/

    function ff(){
    console.log("1111");
    return 1;
    };
    var f = eval(ff);//eval()方法返回ff方法
    var s = ff();//执行ff方法 s=1,打印日志"1111"

    如果参数s是字符串,并且字符串中是表达式,则eval()方法会计算字符串中的表达式,返回该表达式计算的结果。

    举个栗子

    eval("'true'");//返回字符串"true"
    eval("ture");//返回Boolean类型的true
    eval("1");//返回整数1
    eval("[0,1,2]");//返回数组[0,1,2]
    eval("2+2");//返回整数4
    eval("2+'2'");//返回字符串"22"

    如果参数s是字符串,并且字符串中的表达式是JSON格式(此时的JOSN格式外面要加上一对小括号将JSON包围起来),则eval()方法返回该JSON。

    举个栗子

    var j = "{'aa':11,'bb':22}";
    eval("("+j+")");
    //返回{"aa":11,"bb":22}

    eval("({'aa':11,'bb':22})");
    //返回{"aa":11,"bb":22}

    eval("({aa:11,bb:22})");
    //js中{aa:11,bb:22}这种格式在解析时会转换成{'aa':11,'bb':22}这种格式

    eval("{'aa':11,'bb':22}");
    //抛出异常

    附注

    对于eval()方法,上面所说的的JSON格式也是属于表达式的一种。但是如果JSON格式中没有小括号包围,则该eval()方法就不会返回该对象。
    如:eval(“{‘aa’:11,’bb’:22}”)这种格式,就不会返回{‘aa’:11,’bb’:22}。

    因为eval()方法在处理方括号”{}”时,会把它当成是一个语句块。那么eval()方法只会执行该语句,并不会返回该值(结果是抛出异常)。

    正确的写法是:在JSON格式外加上小括号”()”,使其强制类型转换成JSON格式(表达式),并返回该JSON值。这一点和即时函数(function(){})()一样,()的作用也是将该function强制转换成表达式并返回。

    如果参数s是字符串,并且字符串中是语句或语句块,则eval()方法会执行该语句或语句块,并且返回undefined

    举个栗子

    eval("var x='1';");
    //返回undefined
    console.log(x);
    //打印字符串1

    /**>>>>>>>>>>>>>>>**/

    eval("var x=1;var y=2;var z=x+y;");
    //返回undefined
    console.log(z+"");
    //打印字符串3

    /**>>>>>>>>>>>>>>>**/

    s = eval("function t(){alert(3)};t();");
    //执行定义并调用t的方法:弹出3.并且返回undefined
    console.log(s);
    //打印undefined

    /**>>>>>>>>>>>>>>>**/

    eval("var j={sex:'男',age:27};alert(j.age);");
    /*
    此处的json对象不用小括号"()"括起来。因为该处是执行语句,而非计算表达式
    */

    附注

    eval()方法中,如果json格式是存在于语句中的,那么该json格式不需要用小括号”()”括起来。表达式中的json要括起来的原因是,eval()要计算表达式并且返回结果。而eval()对语句只是执行,并不会计较返回值(因为返回的都是(undefined)

    eval()方法的错误处理机制
    如果eval()参数中有非法的表达式和语句,则抛出 SyntaxError 异常。
    如果非法调用 eval(),则抛出 EvalError 异常。
    如果传递给 eval() 的 Javascript 代码生成了一个异常,eval() 将把该异常传递给调用者。

    注:eval()方法在执行js代码时可能会出现异常,所以最好用try…catch语句来执行eval()方法

    举个栗子

    例1:

    var y = "var s = '1ss';s.replace('1','s')";
    try{
    eval(y);//执行该方法
    }catch(exception){
    console.warn(exception);
    }

    例2:

    var y = "var s = 1ss;s.replace('1','s')";
    try{
    eval(y);//抛出异常
    }catch(exception){
    console.warn(exception);
    //打印:Unexpected token ILLEGAL

    例3:

    var y = "var s = 1ss;s.replace('1','s')";
    try{
    var zz = eval;
    zz(y);//执行该方法
    }catch(exception){
    console.warn(exception);
    }

  • 相关阅读:
    html-fieldset线中嵌套字符
    在Windows平台上绿色安装postgresQL
    tomcat处理中文文件名的访问(乱码)
    CSS div水平垂直居中和div置于底部
    java-工具类-读取配置文件
    Win+Ctrl键设置
    eclipse-将同一个文件分屏显示
    spring-poi-excle往单元格写入图片
    spring-初始化完成后运行指定内容
    java-collections.sort异常Comparison method violates its general contract!
  • 原文地址:https://www.cnblogs.com/huhewei/p/12466979.html
Copyright © 2011-2022 走看看