相信知道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);