您的位置:首页 > Web前端 > JavaScript

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

2015-11-25 09:23 351 查看
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执行的代码段可以查询或更改局部变量,但不能在局部作用域中定义新的变量或函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: