表达式计算-eval

来源:互联网 发布:新商盟软件下载 编辑:程序博客网 时间:2024/06/05 01:52
例:
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;}")才不会抛出错误。


0 0
原创粉丝点击