JavaScript 性能提升之路(推薦)
在平時工作做項(xiàng)目的過程中我們有時候會遇到頁面加載很久才加載出來的情況,這樣嚴(yán)重影響了用戶的體驗(yàn)效果。雖然說有時候可能是因?yàn)榫W(wǎng)絡(luò)問題,但有些時候確實(shí)是前端代碼沒有足夠優(yōu)化導(dǎo)致的。所以通過查閱相關(guān)資料并實(shí)踐后,總結(jié)出如下知識點(diǎn)來提升性能。有什么寫得不對的地方還希望各路大神指出并加以指點(diǎn)。
1、數(shù)據(jù)訪問
1、將所有script標(biāo)簽放在盡可能接近body標(biāo)簽底部的位置,盡可能減少對整個頁面下載的影響。

2、盡量少用全局變量。因?yàn)樽兞吭谧饔糜蜴溨械奈恢迷缴?,訪問的時間就越長。局部變量位于作用域鏈中的第一個對象中,全局變量總是位于作用域鏈的最后一環(huán),所以全局變量總是最慢的。
3、避免全局查詢,如果一定要用到全局變量時,并且需要在某個函數(shù)中多次用到該全局變量時,可以定義一個局部變量指向全局變量,來縮短在作用域鏈中的查詢深度。
function addTotrackData(){
var allChildrenNode=getAllChildrenDepartmentNodes();
for (var i = 0; i < allChildrenNode.length; i++) {
for (var j=0,len=track.length;j<len;j++) {
if (trackNode[j]["userId"] == allChildrenNode[i]) {
trackNode[j]["isOnMap"] = true;
}
}
}
}
上面代碼可以改寫為如下所示
function addTotrackData(){
var allChildrenNode=getAllChildrenDepartmentNodes();
var track=trackNode;
for (var i = 0; i < allChildrenNode.length; i++) {
for (var j=0,len=track.length;j<len;j++) {
if (track[j]["userId"] == allChildrenNode[i]) {
track[j]["isOnMap"] = true;
}
}
}
}
4、將集合的length屬性用一個局部變量來保存,在迭代中使用該變量。
for (var j=0,len=track.length;j<len;j++)
5、避免使用with表達(dá)式,因?yàn)樗黾幼饔糜蜴湹拈L度。而且應(yīng)當(dāng)小心的對待try-catch的catch子句,它具有同樣效果。
6、一個屬性或方法在原型鏈中的位置越深,它的訪問速度就越慢。
7、聲明變量時,多個變量合并聲明,可以減少內(nèi)存消耗。
var a; var b; var c; //推薦 var a,b,c
2、Dom操作
Dom(文檔對象模型)是一個獨(dú)立于語言的,使用xml和html文檔操作的應(yīng)用程序接口。在瀏覽器中的接口卻是以javascript來實(shí)現(xiàn)的。Dom和javascript看成兩座島,兩者之間通過一座收費(fèi)的橋連接。一般建議盡量留在javascript島上。
1、用innerHTML代替DOM操作,減少DOM操作次數(shù),優(yōu)化javascript性能。
//dom方式
var str=""
var dom=document.getElementById("test");
var start1=new Date();
for(var j=0;j<100000;j++){
var div=document.createElement("div");
div.innerText="test";
dom.append(div);
}
var end1=new Date();
console.log("dom方式:"+(end1-start1));//dom方式:356
//inerHTML方式
var content="";
var start=new Date();
for(var i=0;i<10000;i++){
content=content+"<div>test</div>";
}
document.getElementById("test").innerHTML=content;
var end=new Date();
console.log("innerHTML方式:"+(end-start));//innerHTML方式:35
2、如果統(tǒng)一個Dom元素或集合被訪問一次以上,最好使用一個局部變量來緩存此Dom成員,在循環(huán)中使用局部變量緩存集合引用和集合元素會提升速度。
3、遍歷children比childNodes更快。children不區(qū)分(包括)注釋節(jié)點(diǎn)和空文本節(jié)點(diǎn),所以快一些。
4、使用element.cloneNode(bool)復(fù)制節(jié)點(diǎn),bool為false表示淺復(fù)制,只復(fù)制當(dāng)前節(jié)點(diǎn),bool為true時,表示深復(fù)制,還會復(fù)制其子節(jié)點(diǎn)。這種方式比document.createElement()速度要快一些。
5、使用document.querySelector和document.querySelectorAll("div.warning,div.notice")來快速查找。因?yàn)樗鼈兎祷匾粋€NodeList——由符合條件的節(jié)點(diǎn)構(gòu)成的類數(shù)組對象,而不是HTML集合(總是表現(xiàn)出存在性),避免了它所固有的性能問題(以及存在的邏輯問題)。querySelectorAll("div.warning,div.notice")還可以進(jìn)行聯(lián)合查詢。
6、修改樣式時,可以使用div.style.cssText來一起修改樣式,或者使用類來修改(便于維護(hù))。
var el = document.getElementById('mydiv');
//修改3次Dom
el.style.borderLeft = '1px';
el.style.borderRight = '2px';
el.style.padding = '5px';
//推薦只需要修改1次Dom
el.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;'
7、盡量避免寫在HTML標(biāo)簽中寫Style屬性,使用外聯(lián)樣式便于維護(hù)和修改。
8、避免圖片和iFrame等的空Src??誗rc會重新加載當(dāng)前頁面,影響速度和效率。
9、采用事件委托。元素連接事件句柄會影響頁面性能,采用委托利用事件冒泡的性能減少元素連接事件。(事件掛接過程都是發(fā)生在onload或DOMContentReady)事件中。
3、循環(huán)
1、for-in是四種循環(huán)方法中速度最慢的一種,一般用于循環(huán)對象(需要查找自身屬性還是原型屬性)。不建議循環(huán)數(shù)組。除非要迭代遍歷一個屬性未知的對象,否則一般不用for-in。
2、改變循環(huán)條件的順序來提高循環(huán)性能。
//推薦
for(var i=items.length;i--;){
//todo
}
//不推薦
for(var i=0,len=items.length;i<len;i++){
//todo
}
3、通過減少循環(huán)體來優(yōu)化性能。
以上所述是小編給大家介紹的JavaScript性能提升詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
uniapp實(shí)現(xiàn)全局設(shè)置字體大小(小中大的字體切換)
隨著UniApp的流行,越來越多的開發(fā)者選擇使用它來構(gòu)建跨平臺應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于uniapp實(shí)現(xiàn)全局設(shè)置字體大小(小中大的字體切換)的相關(guān)資料,需要的朋友可以參考下2023-06-06
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列原理與用法實(shí)例詳解
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列原理與用法,較為詳細(xì)的說明了隊(duì)列的概念、原理,并結(jié)合實(shí)例形式分析了javascript實(shí)現(xiàn)與使用隊(duì)列的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-11-11
將input框中輸入內(nèi)容顯示在相應(yīng)的div中【三種方法可選】
本篇文章主要介紹了在input框中輸入內(nèi)容,會相應(yīng)的顯示在下面的div中的不同做法:js方法;jQuery方法;AngularJs方法,具有很好的參考價值。下面跟著小編一起來看下吧2017-05-05
原生Javascript封裝的一個AJAX函數(shù)分享
這篇文章主要介紹了原生Javascript封裝的一個AJAX函數(shù)分享,本文是實(shí)際項(xiàng)目中提取出來的,簡單易用,需要的朋友可以參考下2014-10-10
一文帶你掌握J(rèn)avaScript中的箭頭函數(shù)
在JavaScript中,箭頭函數(shù)是一種簡化的函數(shù)語法,它在ES6(ECMAScript?2015)引入,本文就來和大家深入講講JavaScript中的箭頭函數(shù)的使用吧2023-05-05

