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
- JavaScript技巧(三)续
- javaScript 常用技巧(三)
- 工作中常用的一些javascript小技巧(三)
- [技巧] Javascript模块化编程(三):require.js的用法
- JavaScript技巧(二)续
- JavaScript的方法和技巧(三)
- JavaScript的方法和技巧(三)
- JavaScript的方法和技巧(三)
- JavaScript技巧续(命名规范)
- JavaScript技巧续
- PS技巧(三)
- JavaScript学习(三)
- Javascript对象(三)
- JavaScript介绍(三)
- JavaScript学习(三)
- JavaScript+总结(三)
- javascript核心(三)
- javascript进阶(三)
- Python中is和==的区别
- IOS 绘制背景色渐变的矩形
- 将博客搬至CSDN
- 友情序言 to 《Learning Spark: Lightning-fast big data analytics》
- IOS真机推送
- JavaScript技巧(三)续
- C语言如何获得精确到毫秒的时间
- PulltoRefresh实现上下拉刷新
- Nsstring编码转换
- Leetcode Triangle
- UITextField 用法小结
- 配置eclipse4ee
- markdown语法指南
- 一步一步做一个linux文件传输软件(二)---->>>废话篇