工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2258|回复: 5

Efficient Javascript

[复制链接]
发表于 2010-7-18 22:42 | 显示全部楼层 |阅读模式
原文:http://dev.opera.com/articles/view/efficient-javascript/
摘要点说明,也算不上是翻译了,想看原文可点进上面链接。

防止使用eval和Function构造函数
    eval可以把字符串当成程序语句执行,例:

  1.         eval("alert('hello world')")//alert('hello world')
复制代码
Function构造函数可以把用字符串做为一个函数体里的语句:如:

  1.        var functionBody=" alert(1); alert(2); alert(3);   ";
  2.        var f=new Function( functionBody );
  3.        //等效于以下代码
  4.        var f=function(){
  5.              alert(1);
  6.              alert(2);
  7.              alert(3);
  8.        }
复制代码
对于js执行引擎来说,通过eval和Function构造函数的方式要比普通形式的语句执行及函数申明方式性能上要慢可能100倍。
不过相对来说,由于Function构造函数并不影响到其周围的代码而eval会影响,所以前者会比后者要好些。
下面是原文例子:

  1. function getProperty(oString) {
  2.   var oReference;
  3.   eval('oReference = test.prop.'+oString);
  4.   return oReference;
  5. }

  6. //以下代码会更好

  7. function getProperty(oString) {
  8.   return test.prop[oString];
  9. }
  10. //以上代码比eval版本快95%以上(opera9 firefox ie,在safari下则是大约85%)
复制代码

  1. function addMethod(oObject,oProperty,oFunctionCode) {
  2.   oObject[oProperty] = new Function(oFunctionCode);
  3. }
  4. addMethod(myObject,'rotateBy90','this.angle=(this.angle+90)%360');
  5. addMethod(myObject,'rotateBy60','this.angle=(this.angle+60)%360');

  6. //不使用Function构造函数的替代方式:

  7. function addMethod(oObject,oProperty,oFunction) {
  8.   oObject[oProperty] = oFunction;
  9. }
  10. addMethod(myObject,'rotateBy90',function () { this.angle=(this.angle+90)%360; });
  11. addMethod(myObject,'rotateBy60',function () { this.angle=(this.angle+60)%360; });
复制代码
避免使用with
我本人除了在AS2外基本上没用过with,with除了会带来昂贵的执行性能代价外,还会出现些莫名其妙的错误。
with会引入一个特别的执行环境,在此环境里的代码,js引擎必须查找所有属性是否属于with所指定的对象。
不要在影响性能的函数里用try-catch-finally 这点几乎不用解释了吧?


原文太长太啰嗦了,有兴趣还是自己看看吧..
发表于 2010-7-19 10:56 | 显示全部楼层
这段代码很明显不公平:
  1. function getProperty(oString) {
  2.   var oReference;
  3.   eval('oReference = test.prop.'+oString);
  4.   return oReference;
  5. }

  6. //以下代码会更好

  7. function getProperty(oString) {
  8.   return test.prop[oString];
  9. }
  10. //以上代码比eval版本快95%以上(opera9 firefox ie,在safari下则是大约85%)
复制代码
回复

使用道具 举报

 楼主| 发表于 2010-7-19 23:48 | 显示全部楼层
有什么"不公平"的 = =||
eval确实会慢,初学者难免会乱用的。
回复

使用道具 举报

 楼主| 发表于 2010-7-19 23:48 | 显示全部楼层
有什么"不公平"的 = =||
eval确实会慢,初学者难免会乱用的。
回复

使用道具 举报

 楼主| 发表于 2010-7-19 23:51 | 显示全部楼层
较常用的是:

  1. var test={
  2.     'p1':function(){return 1;}
  3.     'p2':function(){return 2;]
  4. }
  5. //获取用户输入的i
  6. var output = eval("test.p"+i+"()");

复制代码
回复

使用道具 举报

 楼主| 发表于 2010-7-19 23:54 | 显示全部楼层
原文第三页的内容还是很值得一看的。。。这帖译的太少了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-3 14:50

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表