讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議168:避免二次評估 >

建議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);