JavaScript中的eval函数

相信知道js的肯定都知道js有一个功能强大的函数,就是eval(),它可以来执行一个表达式或者一段语句,下面就来具体看一下这个函数是如何使用的。


一. 参数

该函数的参数是一个字符串,字符串可以是表达式、语句、或者一个函数,如下:

(1)声明一个变量

eval('var x = 1;');
console.log(x);   //1

(2)执行一个表达式

var a = eval('1+2');
console.log(a);   //3

(3)执行一个函数

function test(){
    console.log("看我强大不!");
}
eval('test(); console.log("你真厉害!!")');
//看我强大不!
//你真厉害!!!

(3)声明一个对象

var person = eval('({name: "luwenjing", age: 22})');
console.log(person.name);  //luwenjing

注意在用eval()声明一个对象时,应该用括号括起来,它才会返回一个完整的对象,不然会出错。

(4)一系列语句会如何返回

var y = eval('var sum = 0;for (var i = 0; i < 10; i++){'+
    'sum++;'+
    '}');
console.log(y);   //9


var y = eval('var sum = 0;for (var i = 0; i < 10; i++){'+
    'sum++;'+
    '} 1+2');
console.log(y);  //3

可以看出,执行一批语句并返回结果时,这些语句都将被忽略,然后返回“最后执行到的,有返回值的那条语句”。

二. 作用域

关于函数,我想大家都关心它的作用域是怎样的,下面来看一下:

(1)在闭包中的作用域

var str = 'hello';
function func(){
    eval('var str = "luwenjing"');
    str = str + ", hello";
    console.log(str);
}
func();  //luwenjing, hello
console.log(str);  //hello

可以看出,它的执行环境就是它所处闭包的作用域,eval只是执行一条语句,它并不影响它里面参数的作用域。

(2)修改变量的作用域

var str = 'hello';
function func(){
    window.eval('var str = "luwenjing"');
    str = str + ", hello";
    console.log(str);
}
func();  //luwenjing, hello
console.log(str);  //luwenjing, hello

因为eval是window对象的一个函数,所以可以像修改全局对象那样去修改一个对象的作用域。但是在IE8及IE8一下版本的IE浏览器,这样是无效的,可以像下面这样修改:

var str = 'hello';
function func(){
    if (window.execScript){
        window.execScript('var str = "luwenjing"');
    }
    else{
        window.eval('var str = "luwenjing"');
    }
    str = str + ", hello";
    console.log(str);
}
func();
console.log(str);
-------------本文结束感谢您的阅读-------------