如果你现在的代码中使用了eval(),记住该咒语"eval()是魔鬼".此方法接受任意的字符串,并当作javaScript代码来处理。当有问题的代码是事先知道的(不是运行时确定的),如果代码是运行时动态生成,有一个更好的方式不使用eval而达到同样的目标。
例如,用方括号表示法来访问动态属性会更好更简单:
var property="name";
alert(eval("obj."+property));
alert(obj[property]);
使用eval也带来了安全隐患,因为被执行的代码(例如从网络来)可能已被篡改。
当处理Ajax请求得到JSON相应的时候,一般情况下,最好使用javaScript内置方法来解析JSON相应,以确保安全和有效。
例如:
1.
var data="{root:[{name:'1',value:'0'},{name:'a',value:'b'}]}"
objdata=eval("("+data+")");
最好不要使用eval,在请求时候利用jquery中$.getJSON()来获得服务器返回,
2.
$.getJSON("url",{action:"aa"},function(result){
$.each(data.root,function(i,item)
{
//循环
alert(item[i].name);
});
});
3.
var dataobj=(new Function("","return"+data"))();
同样能达到$.getJSON一样的效果。
同样重要的是要记住,给setInterval(),setTimeout()和Function()构造函数传递字符串,大部分情况下,与使用evaL()是类似的,因此
要避免。在幕后,javascript仍需要评估和执行你给程序传递的字符串:
//反面示例
setTimeout("myFunc()",1000);
setTimeout("myFunc(1,2,3)",1000);
//更好的
setTimeout(myFunc,1000);
setTimeout(function(){
myFunc(1,2,3);
},1000);
使用新的Function()构造就类似于eval(),应小心接近。这可能是一个强大的构造,但往往被误用。如果你绝对必须使用eval(),你可以考虑使用
new Function()代替。有一个小的潜在好处,因为在新Function()中作代码评估是在局部函数作用域中运行,所以代码中任何被评估的通过var
定义的变量都不会自动变成全局变量,另一种方法来阻止自动全局变量是封装eval()调用到一个即时函数中.
考虑下面这个例子,这里仅un作为全局变量污染了命名空间。
alert(typeof un);//undefined
alert(typeof deux);//undefined
alert(typeof trois);//undefined
var jsstring="var un=1; alert(un)";
eval(jsstring);
jsstring="var deux=2; alert(deux)";
new Fuction(jsstring);
jsstring="var trois=3;akert(trois)";
(function(){
eval(jsstring);
}());
alert(typeof un);//number;
alert(typeof deux);//undefined;
alert(typeof trois);//undefined;
另一间eval()和Function构造不同的是eval()可以干扰作用域链,而Function更安分守已些。不管你在哪里执行Function(),它只看到全局作用域。所以期能很好的避免本地变量污染。在下面这例子中,eval()可以访问和修改它外部作用域中的变量,这是Function做不来的(注意到使用Function和new Function是相同的)。
(fucntion(){
var local=1;
eval("local=3;alert(local)"); //3
alert(local);//3
}());
(function(){
var local=1;
Function("alert(local);")();//undefinde
});