js-eval运算符

js中使用eval运算符需要注意——

  • eval()只有一个参数
  • 传入的参数是字符串时,才会去解析执行;否则,将直接返回这个参数
  • 作用域与调用它的变量作用域保持一致
  • 返回字符串中最后一个表达式或语句的值,如果没有,返回undefined
  • eval的字符串执行时的上下文环境和调用函数的上下文环境是一样的,所以下下面这样的例子,就会报脚本错误。
function test(a) {
    eval(a);
}

test("return;");

根据规定,可知,“return;”的上下文环境要和调用 test(a)的上下文环境一样,也就是全局的。因此,eval("return;");就相当于在全局环境中执行了一个return;语句,显然是错误的。

全局eval

如果对eval()赋予别名,然后使用其别名进行字符串的操作,那么规定此时eval会将字符串当成全局代码来执行。执行的代码可能会定义新的全局变量和全局函数,或者给全局变量赋值,但却不能使用或修改主调函数中的局部变量,因此,不会影响到函数内的代码优化。

在ECMAScript 5中,规定直接调用eval()时,它总是在调用它的上下文作用域内执行。其它的间接调用则使用全局对象作为其上下文作用域,并且无法读、写、定义局部变量和函数。例子如下所示:

var geval = eval;
var x = "global", y = "global";

function f() {
      var x = "local";
      eval( "x += ' changed' ; ");
       return x;
}

function g() {
        var y = "local";
        geval("y += ' changed';");
        return y;
}

console.log(f()); //local changed
console.log(x); //global
console.log(g());//local
console.log(y);//global changed
原文地址:https://www.cnblogs.com/lishidefengchen/p/8414409.html