首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议168:避免二次评估

关灯直达底部

避免二次评估是实现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);