例:
var geval=eval;
var x="global";
var 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(),x);
console.log(g(),y);
大家猜一猜运行的结果会是什么?
运行的结果为:localchanged global
local globalchanged
为什么呢?
直接使用eval的时候,它使用的是调用它的并变量作用域。因此,在函数f中直接使用eval函数时,它的执行修改的是调用它的作用域的变量,即局部作用域。所以,局部变量x被修改,而全局变量x未被改变。
而通过其它方式调用时(比如别名调用),它则使用的是将全局对象作为作为其上下文作用域。因此,在函数f中通过eval修改的是全局变量y,局部变量y未被改变。
例:
console.log(eval("var a=1;"));
它的运行结果是:undefined.
在eval运行编译无错时,开始执行代码,并返回最后一个表达式的值,无值时则返回undefined。
因为字符串只是定义变量,无值返回,因此结果为undefined。
例:
var f=function(a){
eval(a);
};
f("return;");
运行结果:抛出语法错误:return not in function。
再次强调:eval的字符串执行的上下文环境和调用函数的上下文环境是一致的。return只有在函数中运行才是有意义的,不能将其作为函数的一部分来执行。所以,执行f("function a(){return 0;}")才不会抛出错误。