JavaScript学习(4.9):eval()简介

4.12 表达式计算eval()
    eval()可以解释运行由JavaScript源代码组成的字符串,并产生一个值。eval()是全局函数。

4.12.1 eval()
      eval()只有一个参数,如果传入的参数不是字符串,它直接返回这个参数。如果参数是字符串,它会把字符串当成JavaScript代码进行编译,如果编译失败则抛出一个语法错误异常。如果编译成功则开始执行这段代码,并返回字符串中的最后一个表达式或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出一个异常,这个异常将把该调用传递给eval()。
     eval()使用了调用它的变量作用域环境。它查找变量的值和定义新变量和函数的操作和局部作用域中的代码完全一样。例如:
定义一个局部变量x,  调用eval(“x”),会返回局部变量的值;
调用eval(“x+1”),改变局部变量的值;
调用eval(“var y = 3;”),声明一个新的局部变量y;
eval(“function f(){ return x+1; }”)声明一个局部函数;
如果在最顶层代码中代用eval(),它会作用于全局变量和全局函数。

*传递给eval()的字符串必须在语法上讲得通---不能通过eval()往函数中任意粘贴代码片段,比如eval(“return;”)是没有意义的,因为return只有在函数中才起作用,并且eval()的字符串执行时的上下文环境和调用函数的上下文环境是一样的,这不能使其作为函数的一部分来运行。如果字符串作为一个单独的脚本是有语义的(如x = 0),那么将其传递给eval()作参数是完全没有问题的,否则将会抛出语法错误异常。

var foo =function(a){
  eval(a);
};

foo("return;");
//SyntaxError: return not in function

foo(" x= 0;");
//undefined

4.12.2  全局eval()

    ECMAScript 3标准规定了任何解释器都不允许对eval()赋予别名。,如果eval()通过别名调用,则会抛出一个EvalError异常。
 
    ECMAScript 5反对使用EvalError,并且规范了eval()的行为。直接调用eval()时,它是在调用它的上下文作用域内执行。其他间接调用则使用全局对象作为其上下文作用域。,并且无法读、写、定义局部变量和函数。

var geval = eval;
var x = "globala" ,y = "globalb";

function f(){
  var x = "locala";
  eval("x +=  'changed';");   //局部eval
  return x;
}

function g(){
  var y = "localb";
  geval("y += 'changed';");  //全局eval
  return y;
}

f(); // localachanged
x; //globala
g(); //locallb
y; //globalbchanged
4.12.3 严格eval()

ECMASript 5严格模式对eval()的行为施加了更多限制。在严格模式下调用eval(),或者eval()执行的代码段以“use strict”指令开始,这里的eval()是私有上下文环境中的局部eval,也就是说,在严格模式下,eval执行的代码段可以查询或更改局部变量,但不能在局部作用域中定义新的变量或函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值