1.eval的基本用法
eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值。
var code1 = "'a' + 2" ;
var code2 = '{ a : 2}' ;
var code3 = "({ a : 2})" ;
document.write("code='a' + 2 Result:" + eval(code1) + " <br>"); //--> a2
document.write("code={ a : 2} Result:" + eval(code2) + "<br>"); //--> 2
document.write("code=({ a : 2}) Result:" + eval(code3) + "<br>"); //--> [object Object]
2.eval作用域的性质
eval函数的特点,它总是在调用它的上下文变量空间(也称为:包,closure)内执行,无论是变量定义还是函数定义都是如此:
var s='global'; //定义一个全局变量 function demo1(){ eval('var s="local"'); } demo1(); alert(s); //-->global
var s='function test(){return 1;}'; //一个函数定义语句 function demo2(){ eval(s); alert(test());//在demo2内部可以执行 } demo2(); alert(test()); //在demo2外部执行则会报错,说明eval总是在调用它的closure内执行
3.在全局空间调用eval()
var X2={} //my namespace:)
X2.Eval=function(code){
if(!!(window.attachEvent && !window.opera)){
//ie
execScript(code);
}else{
//not ie
window.eval(code);
}
}
//测试
var s='global';
function demo3(){
X2.Eval('var s="local"');
}
demo3();
alert(s); //->'local'
4.eval()解析json字符串
如果生成的字符串是JsonArray 形如[{"name":"boke"},{"age":"23"}], 我们可以直接使用eval([{"name":"boke"},{"age":"23"}])生成相应的JSON对象;
如果生成的字符串是JsonObj 形如{“name":"boke","age":"23"},我们使用eval({“name":"boke","age":"23"})生成JSON对象时就会出错 ,我们需要这样写eval(({“name":"boke","age":"23"}))。
var jsonArray = "[{'name':'boke'},{'age':'23'}]";
var jsonObj = "{'name':'boke','age':'23'}";
document.write("Parse JsonArray: " + eval(jsonArray)[0].name + "<br>"); //-->boke
document.write("Parse JsonObj: " + eval("(" + jsonObj + ")").age); //-->23