eval()函数的理解
其使用过方法:接受一个字符串作为参数,并将这个字符串,转换为可执行的js代码执行;
值得注意的是,在这个函数中他调用变量的作用域是查找变量和定义新变量和函数的操作和局部作用域中的代码完全一样
例子:
var a = 1;
eval("console.log(a)");
function fn(){
var a = 3;
eval("console.log(a)");
}
fn();
// 1 3
值得注意的是,传递给eval的字符串必须在语义上面讲的通;而且eval的字符串执行的时候上下文环境和调用函数的环境是一样的。
例子
function fn(){
var a = 3;
eval("return");
}
fn();
// 报错误异常
在ECMAScript5 中 反对 使用 evalError 并且规范了eval的行为
例子
var geval = eval;
var a = 1;
b = 2;
c = 3;
function fn1() {
var a = 5;
eval("a+=2");
return a;
}
function fn2() {
var b = 5;
geval("b+=2");
return b;
}
function fn3() {
var c = 5;
function fn() {
var c = 6;
geval("c+=2");
}
fn();
return c;
}
console.log(fn1(), a);
console.log(fn2(), b);
console.log(fn3(), c);
// 7 1 改变的是 fn1作用域内的局部变量
// 5 4 改变的是 全局作用域下的变量
// 5 5 改变的是 全局作用域下的
总结来说 直接调用eval的,它总是在调用它的上下文作用域内执行,间接调用的,则使用全局对象作为其上下文;
逗号 运算的
var a = (1,2,3,4);
// a 的结果为4
注意以上 均不在严格模式下