|
原文:http://dev.opera.com/articles/view/efficient-javascript/
摘要点说明,也算不上是翻译了,想看原文可点进上面链接。
防止使用eval和Function构造函数
eval可以把字符串当成程序语句执行,例:
- eval("alert('hello world')")//alert('hello world')
复制代码 Function构造函数可以把用字符串做为一个函数体里的语句:如:
- var functionBody=" alert(1); alert(2); alert(3); ";
- var f=new Function( functionBody );
- //等效于以下代码
- var f=function(){
- alert(1);
- alert(2);
- alert(3);
- }
复制代码 对于js执行引擎来说,通过eval和Function构造函数的方式要比普通形式的语句执行及函数申明方式性能上要慢可能100倍。
不过相对来说,由于Function构造函数并不影响到其周围的代码而eval会影响,所以前者会比后者要好些。
下面是原文例子:
- function getProperty(oString) {
- var oReference;
- eval('oReference = test.prop.'+oString);
- return oReference;
- }
- //以下代码会更好
- function getProperty(oString) {
- return test.prop[oString];
- }
- //以上代码比eval版本快95%以上(opera9 firefox ie,在safari下则是大约85%)
复制代码
- function addMethod(oObject,oProperty,oFunctionCode) {
- oObject[oProperty] = new Function(oFunctionCode);
- }
- addMethod(myObject,'rotateBy90','this.angle=(this.angle+90)%360');
- addMethod(myObject,'rotateBy60','this.angle=(this.angle+60)%360');
- //不使用Function构造函数的替代方式:
- function addMethod(oObject,oProperty,oFunction) {
- oObject[oProperty] = oFunction;
- }
- addMethod(myObject,'rotateBy90',function () { this.angle=(this.angle+90)%360; });
- addMethod(myObject,'rotateBy60',function () { this.angle=(this.angle+60)%360; });
复制代码 避免使用with
我本人除了在AS2外基本上没用过with,with除了会带来昂贵的执行性能代价外,还会出现些莫名其妙的错误。
with会引入一个特别的执行环境,在此环境里的代码,js引擎必须查找所有属性是否属于with所指定的对象。
不要在影响性能的函数里用try-catch-finally 这点几乎不用解释了吧?
原文太长太啰嗦了,有兴趣还是自己看看吧.. |
|