网络编程
位置:首页>> 网络编程>> JavaScript>> 如何编写高质量的Javascript代码(8)

如何编写高质量的Javascript代码(8)

 来源:rockux 发布时间:2011-03-07 16:04:00 

标签:javascript,代码,经验

避免使用eval()

如果你在你的代码中使用eval(),那么要记住”eval() is evil”。这个方法会将传入的字符串当做js代码来执行。如果代码是在运行前就确定的,那么没有必要使用eval()。如果代码是在运行时动态确定的,那么也有其他更安全的办法。例如使用方括号形式访问元素的属性:




// antipattern
var property = "name";
alert(eval("obj." + property));  
 
// preferred
var property = "name";
alert(obj[property]);

使用eval()还有安全问题,比如你运行网络上的一段代码,而这段代码又被别人篡改了。在处理Ajax请求返回的JSON数据的时候,最好还是使用浏览器内建的处理方法,如果对于低端的浏览器不支持的,可以从JSON.org上下载对应的处理库。

另外还要记住使用setTimeout、setInterval以及Function的构造函数的是,传入的字符串的参数,js的处理方法跟eval()类似,所以也要注意。因为,js会把你传入的字符串解析执行:




// antipatterns
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);  
 
// preferred
setTimeout(myFunc, 1000);
setTimeout(function () {
   myFunc(1, 2, 3);
}, 1000);

使用Function的构造函数,跟eval()差不多,也要注意。这是个非常有用的功能,但是常常被错用。如果你必须使用eval(),那么可以考虑new一个Function来替代。另外的一个好处就是,使用Function的构造函数,函数的作用域在本方法内,这样你使用var声明的变量就不会变成全局的。另外一个防止eval()生成全局变量的办法就是使用匿名函数。

看看下面这个例子,只有un变量最终是全局的:




console.log(typeof un); // "undefined"
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"  
 
var jsstring = "var un = 1; console.log(un);";
eval(jsstring); // logs "1"  
 
jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // logs "2"  
 
 jsstring = "var trois = 3; console.log(trois);";
 (function () {
    eval(jsstring);
 }()); // logs "3"  
 
 console.log(typeof un); // number
 console.log(typeof deux); // undefined
 console.log(typeof trois); // undefined

eval()和Function构造函数的另一个区别就是eval()会影响到作用域,而Function则相当于一个沙盒。例如:

(function () {
   var local = 1;
   eval("local = 3; console.log(local)"); // logs 3
   console.log(local); // logs 3
}());  
 
(function () {
   var local = 1;
   Function("console.log(typeof local);")(); // logs undefined
 }());

 

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com