表达式计算-eval

例:
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;}")才不会抛出错误。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值