JavaScript技巧(三)续

来源:互联网 发布:奥杜邦的祈祷 知乎 编辑:程序博客网 时间:2024/06/06 01:18

1.避免使用eval:
eval()函数可以将任意字符串当做一个JavaScript代码来执行。当需要讨论的代码是预先就编写好了(不是在动态运行时决定),时没有理由需要使用eval()。而如果代码是在运行时动态生成的,则也有其他更好的方法来代替eval()实现其功能。即:只需要用方括号将需要访问的动态属性括起来就行了

// 反模式:var property = "name";alert(eval("obj."+property));// 推荐的方法 var property = "name";alert(obj[property]);

因为访问对象的属性有两种方式:obj.id 或者 obj[“id”] 。 而第二种方式方式的好处在于可以使用字符串拼接,这样可以使用属性的动态访问,从而用来代替eval()

eval安全隐患:有可能执行被篡改过的代码(例如来自网路的代码),这是在处理来自一个Ajax请求的JSON响应时常见的反模式,最好是使用浏览器内置的方法(JSON.parse())来解析JSON请求,以确保安全性和有效性。要牢记避免使用setInterval()、setTimeout()和function()等构造函数来传递参数,在大部分
情形下,会导致类似eval()的隐患。

JavaScript仍然不得不评估和执行以程序代码方式传递过来的字符串:

// 反模式setTimeout("myFunc()", 1000);setTimeout("myFunc(1, 2, 3)", 1000);// 推荐的模式setTimeout(myFunc, 1000);setTimeout(function() {    myFunc(1, 2, 3);}, 1000);

使用new Function()构造函数和eval()比较类似,因此该函数的使用也需要十分小心。如果一定需要使用eval(),那么可以考虑使用new Function()来代替eval()。这样做的潜在好处是由于在new Function()中的代码将在局部函数空间中运行,因此代码中任何采用var定义的变量不会自动成为全局变量。另一个避免自动成为全局变量的方法是将eval()调用封装到一个即时函数中。

var str = "var un = 1; console.log(un);";eval(str);//1var str = "var deux = 2; console.log(deux);";new Function(str)();//2var str = "var trois = 3; console.log(trois);";(function(){    eval(str);//3}());typeof un;//numbertypeof deux;//undefinedtypeof trois//undefined
0 0
原创粉丝点击