使用+運算會在內存中創建一個新的字符串并把連接的值賦給它。僅僅是將這個結果賦值給一個變量。
為了避免連接結果的中間變量,可以使用+=來直接賦值結果。
運行緩慢的代碼:
a += 'x' + 'y';
運行更快的代碼:
a += 'x'; a += 'y';
原操作會比函數調用快
可以考慮在性能要求關鍵的循環和函數中使用可以替代的原操作。
運行緩慢的代碼:
var min = Math.min(a, b); arr.push(val);
運行更快的代碼:
var min = a < b ? a : b; arr[arr.length] = val;
設置setTimeout() 和 setInterval() 時傳遞函數名而不是字符串
如果你傳遞一個字符串到setTimeout() 或者 setInterval()中,字符串將會被eval計算而導致緩慢。
使用一個匿名函數包裝來代替,這樣在編譯的時候就可以被解釋和優化。
運行緩慢的代碼:
setInterval('doSomethingPeriodically()', 1000); setTimeOut('doSomethingAfterFiveSeconds()', 5000);
運行更快的代碼:
setInterval(doSomethingPeriodically, 1000); setTimeOut(doSomethingAfterFiveSeconds, 5000);
避免在對象中使用不需要的DOM引用
不要這么做:
var car = new Object(); car.color = "red"; car.type = "sedan"
更好的一種形式:
var car = { color : "red"; type : "sedan" }
最清晰的目標速度,最小化作用域鏈
低效率方法:
var url = location.href;
一種高效形式:
var url = window.location.href;
試著在腳本中少使用注釋,避免使用長變量名
盡可能的保證注釋少或者避免使用注釋,特別是在函數,循環以及數組中。
注釋不必要的減緩腳本執行并且增加了文件大小。比如:
不建議的形式:
function someFunction() { var person_full_name="somename"; /* stores the full name*/ }
更好的寫法:
function someFunction() { var name="somename"; }
在當前作用域存儲應用的外部變量
當一個函數被執行的運行上下問被穿件,一個活動的對象會包含所有局部變量會被推到上下文鏈的前面。
在作用域鏈中,最慢的是清楚的識別標識符,意味著局部變量是最快的。存儲頻繁使用的外部變量讀和寫都會明顯的加快。這對于全局變量和其他深層次的標識符查找特別明顯。
同樣,在當前作用域中的變量(var myVar)比對象像屬性的訪問速度快(this.myVar)。
運行緩慢的代碼:
function doSomething(text) { var ps = document.getElementsByTagName('p'), text = ['foo', /* ... n ... */, 'bar']; for (var i = 0, l = ps.length; i < l; i++) { ps[i].innerHTML = text[i]; } }
運行更快的代碼:
function doSomethingFaster(text) { var doc = document, ps = doc.getElementsByTagName('p'), text = ['foo', /* ... n ... */, 'bar']; for (var i = 0, l = ps.length; i < l; i++) { ps[i].innerHTML = text[i]; } }
如果你需要訪問一個元素(如 head)在一個大的循環中,使用一個本地的DOM訪問(如例子中的get)會更快。
運行更快的代碼:
function doSomethingElseFaster() { var get = document.getElementsByTagName; for (var i = 0, i < 100000; i++) { get('head'); } }
使用變量緩存值
在做重復工作的地方使用局部變量緩存值。
下面的一組例子表明了存儲值到局部變量的廣泛意義。
例子1.計算執行前在循環體內使用變量存儲數學函數
錯誤的方法:
var d=35; for (var i=0; i<1000; i++) { y += Math.sin(d)*10; }
更好的處理:
var d = 55; var math_sind = Math.sin(d)*10; for (var i=0; i<1000; i++) { y += math_sind; }
例子2.保存數組的長度在循環中使用
糟糕的處理:
數組的長度每次都會被重復計算
for (var i = 0; i < arr.length; i++) { // do something }
更好的改進:
更好的方法是保存數組的長度
for (var i = 0, len = arr.length; i < len; i++) { // do something }
總的來說,如果已經做了一次,我們就不需要重復的做不必要的工作。例如,作用域或者函數中多次使用到計算的一個表達式的值,保存到變量可以使它多次被使用,否則我們會過頭的聲明一個變量并賦值然后只適用一次。所以請記住這些。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com