eval() 定义
eval() 函数用于计算或执行参数。如果参数是表达式,则 eval() 计算表达式。如果参数是一个或多个 JavaScript 语句,则 eval() 执行这些语句
表达式和js语句
js表达式:一个表达式会产生一个值,如
a
1+1
demo(1)
x === y ? 'a' : 'b'
、
js语句:js代码都是js语句(当然也包括js表达式),if判断和for循环都算js语句
1 . if(){}
2 . for(){}
eval()使用
- JavaScript可以通过全局函数
eval()
解释运行由JavaScript源代码组成的字符串 - 它会把字符串当成JavaScript代码进行编译,如果编译失败则抛出一个语法错误异常
- 如果传递给
eval()
的 Javascript 代码生成了一个异常,eval() 将把该异常传递给调用者。 - 传递给
eval()
的字符串必须在语法上行的通,不能通过eval()
往函数中任意粘贴代码片段,比如:eval('return;')
是没有意义的,因为return只有在函数中才起到作用 - 如果编译成功,则开始执行这一段代码,并返回字符串中的最后一个表达式会或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。
eval()
中的字符串执行时的上下文环境和调用函数的上下文环境是一样的
参数
eval()
只有一个参数是string
类型的JavaScript
表达式、变量、语句或语句序列。- 如果传入的参数不是字符串,它直接返回这个函数。
作用域
-
eval()
执行JavaScript
代码或者定义变量/函数和局部作用域中的代码保持一致。如果一个函数定义了一个局部变量b
,然后调用eval('b')
,它会返回局部变量的值。
-
如果它调用
eval('a=1')
,它会改变局部变量的值。
-
如果函数调用了
eval('var b=2;')
,则声明了一个新的局部变量b
-
如果在最顶层的代码中调用eval(),当然,它会作用于全局变量和全局函数
-
当通过别名调用时,eval会将其字符串当成顶层的全局代码来执行,执行的代码可能会定义新的全局变量和全局函数,或者给全局变量赋值,但却不能使用或者修改作用函数中的局部变量
var standEval = eval; //使用别名调用evla将是全局eval
var x="ahua",y="ahua"; //两个全局变量
function f(){ //函数内执行的是局部eval
var x="hello"; //定义局部变量
eval("x += ' world';");//直接使用eval改变的局部变量的值 x='hello world'
return x; //返回更改后的局部变量
}
function g(){ //这个函数内执行了全局eval
var y="hello";
standEval("y += ' world';"); //当通过别名调用时,eval会将其字符串当成顶层的全局代码来执行,即现在操作的是外层的y y="ahua world"
return y; //返回的是局部变量y y="hello"
}
console.log(f(),x); //改变局部,输出 “hello world ahua”
console.log(g(),y); //改变了全局变量,输出 “hello”