日前,看到一位朋友在eval json串的,采用了
var a=new Function("return "+json);
a();
的方式 。
想着人家为什么不用eval 于是就做了一个它们之间的 性能测试
<head>
<title>代理测试</title>
<script type="text/javascript">
//var aa="{aa:'xx'}";
var aa="{name:'cola',item:[{age:11},{age:22},{age:23},{age:23}]}";
var now=new Date().getTime();
for(var i=0;i<1000;i++){
eval("("+aa+")");
}
var now1=new Date().getTime();
alert(now1-now);
var now2=new Date().getTime();
for(var i=0;i<1000;i++){
var fn=new Function("return"+aa);
fn();
}
var now3=new Date().getTime();
alert(now3-now2);
</script>
</head>
结果发现在IE中eval是110ms,而fuction是172ms
在FF2中,eval是由1906ms,而fuctnion 187ms
可以看出 FF还是慢于IE6.但是eval在FF是出奇地慢。
可不可以改进一下eval呢?
var morik={};
morik.eval=function(s){
if(navigator.userAgent.toLowerCase().indexOf("msie") > -1)
return eval(s);
else{
var aa=new Function( "return"+s);
return aa.apply(this);
}
};
本想采用
var _e=window.eval;
var eval=fucntion(s){...},
但是改不了作用域,上下文变量通过函数的能达到一定的效果。
便是this却得不到指向运行eval方法的函数指向的。
因为想兼容以前的代码,没有采用eval.apply(this,[])的方法。
有什么好的方法?
prk 08- 09-11