谈谈eval

1. eval的定义和基本用法:eval(string)
  参数 -- 是要计算的字符串,其中包含要计算的js表达式或者要执行的语句
  返回值 -- 通过计算string得到的值
  说明 -- 该方法只接受原始字符串作为参数,否则将直接返回,所以不要传递String对象
      如果试图覆盖eval属性或者把eval()方法赋予另一个属性,并通过该属性调用他,则抛出异常
  抛出 -- 如果参数没有合法的表达式和语句,则抛出SyntaxError
      如果非法调用eval(),则抛出EvalError
      如果传递给eval()的js代码生成了一个异常,eval()将把该异常传递给调用者
2. 在函数内执行全局代码
  (1).eval()函数动态执行的代码并不会创建新的作用域,其代码就是在当前的作用于执行的,因此eval()函数可以使用当前作用域的this和argument等对象

      var s='global'; //定义一个全局变量
      function demo1(){
        eval('var s="local"');
      }
      demo1();
      alert(s); //->global

  (1).对于IE浏览器,默认已经提供了这样的函数:execScript,用于在全局空间执行代码。
  (2).对于Firefox浏览器,直接调用eval函数,则在调用者的空间执行;如果调用window.eval则在全局空间执行。

      var X2={} //my namespace:)
      X2.Eval=function(code){
        if(!!(window.attachEvent && !window.opera)){
          //ie
          execScript(code); 
        }else{
          //not ie
          window.eval(code);
        }
      }
      var s='global';
      function demo3(){
        X2.Eval('var s="local"');
      }
      demo3();
      alert(s); //->'local'

3. eval和JSON
  (1).eval函数试图去执行传入参数里的表达式或者合法的js语句,把最后一个表达式或者语句包含的值或者引用做为返回值
  (2).JSON 和 对象字面量(Object Literals)的区别:JSON 的名字部分严格用引号+名字来表示。
  (3).转化的JSON为JS对象时,需要将 JSON 字符串的外面包装一层园括号
    若不加外层的括号,那么eval会将大括号做为JS代码块的开始结束标志,则{}北认为是执行了一句空语句

      alert(eval("{}")); //return undefined 
      alert(eval("({})")); //return [object Object]
原文地址:https://www.cnblogs.com/lindsayzhao103011/p/3186613.html