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

2、盡量少用全局變量。因?yàn)樽兞吭谧饔糜蜴溨械奈恢迷缴?,訪問(wèn)的時(shí)間就越長(zhǎng)。局部變量位于作用域鏈中的第一個(gè)對(duì)象中,全局變量總是位于作用域鏈的最后一環(huán),所以全局變量總是最慢的。
3、避免全局查詢,如果一定要用到全局變量時(shí),并且需要在某個(gè)函數(shù)中多次用到該全局變量時(shí),可以定義一個(gè)局部變量指向全局變量,來(lái)縮短在作用域鏈中的查詢深度。
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屬性用一個(gè)局部變量來(lái)保存,在迭代中使用該變量。
for (var j=0,len=track.length;j<len;j++)
5、避免使用with表達(dá)式,因?yàn)樗黾幼饔糜蜴湹拈L(zhǎng)度。而且應(yīng)當(dāng)小心的對(duì)待try-catch的catch子句,它具有同樣效果。
6、一個(gè)屬性或方法在原型鏈中的位置越深,它的訪問(wèn)速度就越慢。
7、聲明變量時(shí),多個(gè)變量合并聲明,可以減少內(nèi)存消耗。
var a; var b; var c; //推薦 var a,b,c
2、Dom操作
Dom(文檔對(duì)象模型)是一個(gè)獨(dú)立于語(yǔ)言的,使用xml和html文檔操作的應(yīng)用程序接口。在瀏覽器中的接口卻是以javascript來(lái)實(shí)現(xiàn)的。Dom和javascript看成兩座島,兩者之間通過(guò)一座收費(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)一個(gè)Dom元素或集合被訪問(wèn)一次以上,最好使用一個(gè)局部變量來(lái)緩存此Dom成員,在循環(huán)中使用局部變量緩存集合引用和集合元素會(huì)提升速度。
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時(shí),表示深復(fù)制,還會(huì)復(fù)制其子節(jié)點(diǎn)。這種方式比document.createElement()速度要快一些。
5、使用document.querySelector和document.querySelectorAll("div.warning,div.notice")來(lái)快速查找。因?yàn)樗鼈兎祷匾粋€(gè)NodeList——由符合條件的節(jié)點(diǎn)構(gòu)成的類數(shù)組對(duì)象,而不是HTML集合(總是表現(xiàn)出存在性),避免了它所固有的性能問(wèn)題(以及存在的邏輯問(wèn)題)。querySelectorAll("div.warning,div.notice")還可以進(jìn)行聯(lián)合查詢。
6、修改樣式時(shí),可以使用div.style.cssText來(lái)一起修改樣式,或者使用類來(lái)修改(便于維護(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會(huì)重新加載當(dāng)前頁(yè)面,影響速度和效率。
9、采用事件委托。元素連接事件句柄會(huì)影響頁(yè)面性能,采用委托利用事件冒泡的性能減少元素連接事件。(事件掛接過(guò)程都是發(fā)生在onload或DOMContentReady)事件中。
3、循環(huán)
1、for-in是四種循環(huán)方法中速度最慢的一種,一般用于循環(huán)對(duì)象(需要查找自身屬性還是原型屬性)。不建議循環(huán)數(shù)組。除非要迭代遍歷一個(gè)屬性未知的對(duì)象,否則一般不用for-in。
2、改變循環(huán)條件的順序來(lái)提高循環(huán)性能。
//推薦
for(var i=items.length;i--;){
//todo
}
//不推薦
for(var i=0,len=items.length;i<len;i++){
//todo
}
3、通過(guò)減少循環(huán)體來(lái)優(yōu)化性能。
以上所述是小編給大家介紹的JavaScript性能提升詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
uniapp實(shí)現(xiàn)全局設(shè)置字體大小(小中大的字體切換)
隨著UniApp的流行,越來(lái)越多的開(kāi)發(fā)者選擇使用它來(lái)構(gòu)建跨平臺(tái)應(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ì)的說(shuō)明了隊(duì)列的概念、原理,并結(jié)合實(shí)例形式分析了javascript實(shí)現(xiàn)與使用隊(duì)列的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-11-11
將input框中輸入內(nèi)容顯示在相應(yīng)的div中【三種方法可選】
本篇文章主要介紹了在input框中輸入內(nèi)容,會(huì)相應(yīng)的顯示在下面的div中的不同做法:js方法;jQuery方法;AngularJs方法,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05
原生Javascript封裝的一個(gè)AJAX函數(shù)分享
這篇文章主要介紹了原生Javascript封裝的一個(gè)AJAX函數(shù)分享,本文是實(shí)際項(xiàng)目中提取出來(lái)的,簡(jiǎn)單易用,需要的朋友可以參考下2014-10-10
常見(jiàn)Ajax下載文件方式以及報(bào)錯(cuò)解決辦法
AJAX(Asynchronous JavaScript and XML)是一種用于創(chuàng)建快速、動(dòng)態(tài)和交互式網(wǎng)頁(yè)的技術(shù),它的主要優(yōu)勢(shì)在于能夠在不刷新整個(gè)網(wǎng)頁(yè)的情況下與服務(wù)器進(jìn)行數(shù)據(jù)交互,這篇文章主要給大家介紹了關(guān)于常見(jiàn)Ajax下載文件方式以及報(bào)錯(cuò)解決辦法的相關(guān)資料,需要的朋友可以參考下2024-01-01
一文帶你掌握J(rèn)avaScript中的箭頭函數(shù)
在JavaScript中,箭頭函數(shù)是一種簡(jiǎn)化的函數(shù)語(yǔ)法,它在ES6(ECMAScript?2015)引入,本文就來(lái)和大家深入講講JavaScript中的箭頭函數(shù)的使用吧2023-05-05
解析Javascript中難以理解的11個(gè)問(wèn)題
這篇文章主要是對(duì)Javascript中難以理解的11個(gè)問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12

