使用+運算會在內(nèi)存中創(chuàng)建一個新的字符串并把連接的值賦給它。僅僅是將這個結(jié)果賦值給一個變量。
為了避免連接結(jié)果的中間變量,可以使用+=來直接賦值結(jié)果。
運行緩慢的代碼:
a += 'x' + 'y';
運行更快的代碼:
a += 'x'; a += 'y';
原操作會比函數(shù)調(diào)用快
可以考慮在性能要求關(guān)鍵的循環(huán)和函數(shù)中使用可以替代的原操作。
運行緩慢的代碼:
var min = Math.min(a, b); arr.push(val);
運行更快的代碼:
var min = a < b ? a : b; arr[arr.length] = val;
設(shè)置setTimeout() 和 setInterval() 時傳遞函數(shù)名而不是字符串
如果你傳遞一個字符串到setTimeout() 或者 setInterval()中,字符串將會被eval計算而導(dǎo)致緩慢。
使用一個匿名函數(shù)包裝來代替,這樣在編譯的時候就可以被解釋和優(yōu)化。
運行緩慢的代碼:
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;
試著在腳本中少使用注釋,避免使用長變量名
盡可能的保證注釋少或者避免使用注釋,特別是在函數(shù),循環(huán)以及數(shù)組中。
注釋不必要的減緩腳本執(zhí)行并且增加了文件大小。比如:
不建議的形式:
function someFunction() { var person_full_name="somename"; /* stores the full name*/ }
更好的寫法:
function someFunction() { var name="somename"; }
在當(dāng)前作用域存儲應(yīng)用的外部變量
當(dāng)一個函數(shù)被執(zhí)行的運行上下問被穿件,一個活動的對象會包含所有局部變量會被推到上下文鏈的前面。
在作用域鏈中,最慢的是清楚的識別標識符,意味著局部變量是最快的。存儲頻繁使用的外部變量讀和寫都會明顯的加快。這對于全局變量和其他深層次的標識符查找特別明顯。
同樣,在當(dāng)前作用域中的變量(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)在一個大的循環(huán)中,使用一個本地的DOM訪問(如例子中的get)會更快。
運行更快的代碼:
function doSomethingElseFaster() { var get = document.getElementsByTagName; for (var i = 0, i < 100000; i++) { get('head'); } }
使用變量緩存值
在做重復(fù)工作的地方使用局部變量緩存值。
下面的一組例子表明了存儲值到局部變量的廣泛意義。
例子1.計算執(zhí)行前在循環(huán)體內(nèi)使用變量存儲數(shù)學(xué)函數(shù)
錯誤的方法:
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.保存數(shù)組的長度在循環(huán)中使用
糟糕的處理:
數(shù)組的長度每次都會被重復(fù)計算
for (var i = 0; i < arr.length; i++) { // do something }
更好的改進:
更好的方法是保存數(shù)組的長度
for (var i = 0, len = arr.length; i < len; i++) { // do something }
總的來說,如果已經(jīng)做了一次,我們就不需要重復(fù)的做不必要的工作。例如,作用域或者函數(shù)中多次使用到計算的一個表達式的值,保存到變量可以使它多次被使用,否則我們會過頭的聲明一個變量并賦值然后只適用一次。所以請記住這些。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com