JavaScript的性能优化

1. eval问题

有eval的代码比没有eval的代码慢100倍以上。主要原因是:

JavaScript 代码在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用 var 申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是 undefined,并将那些以 function 定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。但是,如果你使用了“eval”,则“eval”中的代码(实际上为字符串)无法预先识别其上下文,无法被提前解析和优化,即无法进行预编译的操作。所以,其性能也会大幅度降低。

2. 函数的作用域链

依据函数的作用域链去访问变量等操作也是一个影响效率的因素。因此在函数内对于非当前作用域内变量的访问,我们可以利用局部变量保存访问的结果,从而减少访问的次数,达到提高效率的目的。

3. 慎用with

慎用with的原因是with增加了作用域链的层级。在with语句中访问with外的变量相当于访问上一层作用域中的变量。因此,会降低JavaScript的执行效率。

4. String相关

  • 避免隐式类型转换

  var str = “12345678”,

    arr = []; 

      for(var i = 0; i <= s.length; i++) {

      arr.push( str.charAt(i));

    }

     在调用.charAt时,str会隐式转换为new String("12345678").

     对于如下代码也会产生临时对象:

     for(var i = 0; i < str_array.length; i++) { 

    str_array[i].match(/^s*extra\s/);

  }

  /^s*extra\s/ 这个会产生临时正则表达式对象。

   var reg = /^s*extra\s/;

   for(var i = 0; i < str_array.length; i++) { 

    str_array[i].match(reg );

  }

  这样便不会有临时对象产生和销毁的开销了。

 

     

posted @ 2014-04-06 12:01  临风远望  阅读(141)  评论(0编辑  收藏  举报