5、避免双重解释
双重解释的情况也是我们经常会碰到的,有的时候我们没怎么考虑到这种情况会影响到效率,双重解释一般在我们使用eval、new Function和setTimeout等情况下会遇到,我们看看下面的例子:

?
< div id = "demo" > div >
< input id = "but1" type = "button" onclick = "func1()" value = "效率低" />
< input id = "but2" type = "button" onclick = "func2()" value = "效率高" />

?
var sum, num1 = 1, num2 = 2;
function func1(){
var start = new Date().getTime();
for ( var i = 0; i < 10000; i++){
var func = new Function( "sum+=num1;num1+=num2;num2++;" );
func();
}
var end = new Date().getTime();
alert( "用时 " + (end - start) + " 毫秒" );
}
function func2(){
var start = new Date().getTime();
for ( var i = 0; i < 10000; i++){
sum+=num1;
num1+=num2;
num2++;
}
var end = new Date().getTime();
alert( "用时 " + (end - start) + " 毫秒" );
}

第一种情况我们是使用了new Function来进行双重解释,而第二种是避免了双重解释,我们看看在不同浏览器下的表现:

IE6.0
函数 第1次 第2次 第3次 第4次 第5次 平均
func1 109ms 110ms 110ms 125ms 109ms 112.6ms
func2 0ms 15ms 15ms 0ms 0ms 6ms
Firefox4.0
函数 第1次 第2次 第3次 第4次 第5次 平均
func1 631ms 644ms 632ms 659ms 618ms 636.8ms
func2 0ms 0ms 1ms 1ms 1ms 0.6ms
Chrome6.0
函数 第1次 第2次 第3次 第4次 第5次 平均
func1 16ms 2ms 11ms 16ms 12ms 11.4ms
func2 0ms 0ms 0ms 0ms 0ms 0ms

可以看到,在所有的浏览器中,双重解释都是有很大开销的,所以在实际当中要尽量避免双重解释。

感谢"SeaSunK"对第四点测试报告错误的指正,现在已经修改过来了。至于最后一点提出的func1每次都初始化,没有可比性,所以我给换了eval,结果发现,在IE6.0下还是有影响,而且在Firefox下,使用eval对效率的影响程度更加厉害,在Firefox下,如果10000次循环,需要十多秒的时间,所以我把循环都变成了1000次。看代码和报告。


?
var sum, num1 = 1, num2 = 2;
function func1(){
var start = new Date().getTime();
for ( var i = 0; i < 1000; i++){
eval( "sum+=num1;num1+=num2;num2++;" );
}
var end = new Date().getTime();
alert( "用时 " + (end - start) + " 毫秒" );
}
function func2(){
var start = new Date().getTime();
for ( var i = 0; i < 1000; i++){
sum+=num1;
num1+=num2;
num2++;
}
var end = new Date().getTime();
alert( "用时 " + (end - start) + " 毫秒" );
}


IE6.0
函数 第1次 第2次 第3次 第4次 第5次 平均
func1 16ms 16ms 16ms 0ms 15ms 12.6ms
func2 0ms 0ms 0ms 0ms 0ms 0ms
Firefox4.0
函数 第1次 第2次 第3次 第4次 第5次 平均
func1 1245ms 1243ms 1236ms 1227ms 1238ms 1237.8ms
func2 0ms 0ms 0ms 0ms 0ms 0ms
Chrome6.0
函数 第1次 第2次 第3次 第4次 第5次 平均
func1 0ms 1ms 1ms 0ms 1ms 0.6ms
func2 0ms 0ms 0ms 0ms 0ms 0ms