一 script加載方式和位置
1 放在body標(biāo)簽底部,確保執(zhí)行腳本前頁面已經(jīng)完成渲染
2 合并腳本,減少script標(biāo)簽數(shù)目,減少http請(qǐng)求數(shù)目,加載更快
3 無阻加載js的方法:
3.1 在script標(biāo)簽上添加defer屬性
3.2 動(dòng)態(tài)創(chuàng)建script標(biāo)簽加載并立即執(zhí)行
3.3 使用ajax請(qǐng)求下載js代碼并注入頁面
二 數(shù)據(jù)存儲(chǔ)的優(yōu)化
1 執(zhí)行一個(gè)函數(shù)會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境的內(nèi)部對(duì)象,函數(shù)每次執(zhí)行的執(zhí)行環(huán)境都是獨(dú)一無二的,多次調(diào)用一個(gè)函數(shù)會(huì)創(chuàng)建多個(gè)執(zhí)行環(huán)境,當(dāng)函數(shù)執(zhí)行完畢,執(zhí)行環(huán)境銷毀
2 在函數(shù)執(zhí)行的過程中,每次遇到一個(gè)變量,都會(huì)經(jīng)歷一次標(biāo)識(shí)符解析過程。標(biāo)識(shí)符位置越深,讀寫的速度就越慢。因此,函數(shù)中讀取局部變量的速度是最快的,全局變量總是最慢的。
3 函數(shù)中盡量使用局部變量,如果有跨作用域調(diào)用其他作用域的變量使用多次,最好將其存儲(chǔ)到局部變量
4 閉包因?yàn)楹瘮?shù)執(zhí)行完不能清除屬性對(duì)象,帶來額外的性能消耗
5 對(duì)象在創(chuàng)建是不但設(shè)置了自由的屬性和方法,還繼承了對(duì)象原型上的屬性和方法,當(dāng)對(duì)象嵌套的越深,在其原型鏈上越深,讀取的速度越慢,執(zhí)行l(wèi)ocations.href總是比window.location.href要快,
6 如果要查找對(duì)象屬性多次,最佳做法將其屬性保存到局部變量中,這樣做會(huì)顯著提高性能
三 dom編程的優(yōu)化
1 訪問和修改dom
dom和js就像兩座小島,每次連接都會(huì)經(jīng)過他們之間連接的收費(fèi)大橋,會(huì)有性能損耗,
多次使用到相同的dom,使用緩存
querySelectAll()獲取比getElementById這些選擇器更快
修改同一個(gè)dom屬性多次,代碼放在一起多次修改會(huì)更快,或者做一次處理,或者修改class名稱
2 批量修改dom
2.1 脫離文檔流
2.2 應(yīng)用多重改變
2.3 把元素帶回文檔
可以在操作前設(shè)置display:none,完成后設(shè)置為block或者重新創(chuàng)建一個(gè)dom,然后在此上操作最后添
加到文檔上,還有一 種方法,操作的dom進(jìn)行克隆,對(duì)其操作完成后,然后替換掉原先的dom
3 使用事件委托,可以將多個(gè)li點(diǎn)擊在ul上觸發(fā)事件
var oDiv = document.getElementsByTagName('ul')[0];
var li = document.getElementsByTagName('li');
oDiv.onclick = function(e){
var target = e.target;
alert(Array.prototype.indexOf.call(li,target))
}
四 算法和流程控制
4.1 for-in foreach算法比for while等其他幾種循環(huán)要慢,因?yàn)槊看蔚鷷?huì)同時(shí)搜索實(shí)例或者原型
4.2 在遍歷中需要用到的變量要提前聲明,減少次數(shù)和操作
4.3 if-else和switch的用法:當(dāng)判斷較少是用if-else,較多是用switch,因?yàn)楫?dāng)判斷增多時(shí),