避免二次評估是實現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);