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 );
}
这样便不会有临时对象产生和销毁的开销了。