避免二次评估是实现JavaScript性能优化的一种措施。与许多脚本语言一样,JavaScript允许在程序中获取一个包含代码的字符串后运行它,有4种标准函数可以实现这一过程:eval_r、Function构造器、setTimeout和setInterval。每个函数允许传入一串JavaScript代码后运行它。
var num1=5,num2=6,
result=eval_r("num1+num2"),
sum=new Function("arg1","arg2","return arg1+arg2");
setTimeout("sum=num1+num2",100);
setInterval("sum=num1+num2",100);
当在JavaScript代码中执行另一段JavaScript代码时,将会付出二次评估的代价。以上代码首先被评估为正常代码,然后在执行过程中运行字符串中的代码,此时发生另一次评估。二次评估是一项代价较高的操作,与直接包含相应代码相比将占用更长时间。
作为一个比较点,不同浏览器访问一个数组项所占用的时间各有不同,而使用eval_r访问所占用的时间差别更大。
var item=array[0];//比较快
var item=eval_r("array[0]");//比较慢
如果使用eval_r代替直接代码访问10 000个数组项,那么在不同浏览器上将会有非常巨大的差异。
在访问数组项时间上存在巨大差异,原因是每次调用eval_r时要创建一个新的解释/编译实例。同样的过程也发生在Function,setTimeout和setInterval上,自动使代码执行速度变慢。
在大多数情况下,没必要使用eval_r或Function,如果可能,尽量避免使用它们。至于另外两个函数,setTimeout和setInterval,建议通过第一个参数传入一个函数而不是一个字符串,例如:
setTimeout(function{
sum=num1+num2;
},100);
setInterval(function{
sum=num1+num2;
},100);