日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

优化JS代码性能

發(fā)布時(shí)間:2023/12/31 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 优化JS代码性能 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

優(yōu)化JS代碼性能

優(yōu)化循環(huán)

我們來(lái)看一段段代碼

function LoopBad(){ var footballTeam={coach:"xiaohu",members:['羅納爾多','半澤直樹(shù)','費(fèi)德勒']};for (var i = 0; i < footballTeam.members.length; i++) {console.log(footballTeam.members[i])}; }

這段代碼循環(huán)footballTeam中的members數(shù)組,然后打印隊(duì)員。怎么優(yōu)化呢?首先f(wàn)ootballTeam.members.length可以緩存一下,footballTeam.members[i]也可以緩存一下,看一下下面的代碼就知道了。為什么要緩存呢,因?yàn)樵谘h(huán)中重復(fù)的去尋找屬性是沒(méi)有必要的,這里緩存一下是可以加快速度的。

function LoopGood(){ var footballTeam={coach:"xiaohu",members:['羅納爾多','半澤直樹(shù)','費(fèi)德勒']};var members = footballTeam.members;for (var i = 0, Length = footballTeam.members.length; i < Length ; i++) {console.log(members[i])}; }

html中如何加載js代碼

我們?cè)趆tml中引用js一般來(lái)說(shuō)這么寫的

<!DOCTYPE html> <html ><head><meta charset="UTF-8"><title>Simple Map</title><link rel="stylesheet" href="css/style.css"><script type="text/javascript" src="js/index.js"></script></head><body><div>這里有很多內(nèi)容</div></body> </html>

這時(shí)候js加載會(huì)影響html的顯示,有什么方法可以讓非必要的js后加載呢?

<!DOCTYPE html> <html ><head><meta charset="UTF-8"><title>Simple Map</title><link rel="stylesheet" href="css/style.css"></head><body><div>這里有很多內(nèi)容</div><script type="text/javascript" src="js/index.js"></script></body> </html>

上面的代碼把js文件放在</body>前面,這樣html就會(huì)先被瀏覽器引擎渲染了。所以我們看到很多人都把js放在后面,不過(guò)放在前面畢竟復(fù)合閱讀習(xí)慣,好在現(xiàn)在有了async屬性,我們看看下面的代碼。

<!DOCTYPE html> <html ><head><meta charset="UTF-8"><title>Simple Map</title><link rel="stylesheet" href="css/style.css"><script type="text/javascript" src="js/index.js" async></script></head><body><div>這里有很多內(nèi)容</div></body> </html>

使用原型節(jié)省內(nèi)存

我們來(lái)看看FootballTeam的構(gòu)造函數(shù)怎么定義的。FootballTeam的構(gòu)造函數(shù)有一個(gè)play函數(shù),在里面打印一段話。這個(gè)構(gòu)造函數(shù)有什么問(wèn)題呢?問(wèn)題就是play函數(shù)在每個(gè)對(duì)象中都會(huì)存在
,浪費(fèi)內(nèi)存啊,創(chuàng)建對(duì)象也更費(fèi)時(shí)間。

function FootballTeam(name){this.members=25;this.name=name;//這個(gè)函數(shù)在每個(gè)對(duì)象中都會(huì)存在,最好移動(dòng)到原型中,節(jié)省內(nèi)存和創(chuàng)建對(duì)象的時(shí)間this.play = function(){console.log(name+'喜歡張雨綺!');} } var realMadrid = new FootballTeam('皇家馬戲團(tuán)'); var theBARCELONA = new FootballTeam('拉瑪西亞影視學(xué)院'); realMadrid.play(); theBARCELONA.play();

最好移動(dòng)到原型中,節(jié)省內(nèi)存和創(chuàng)建對(duì)象的時(shí)間。

function FootballTeamBetter(name){this.members=25;this.name=name; } FootballTeamBetter.prototype = {play:function(){console.log(this.name+'喜歡張雨綺!');} } var realMadridBetter = new FootballTeamBetter('皇家馬德里'); var theBARCELONABetter = new FootballTeamBetter('巴薩'); realMadridBetter.play(); theBARCELONABetter.play();

有效率的dom操作

我們來(lái)看下面一段代碼,這段代碼增加很多足球隊(duì)員到list中,功能上是沒(méi)問(wèn)題的。但是在循環(huán)中,每次增加一個(gè)element到list中,都會(huì)讓瀏覽器reflow(重新載入)DOM樹(shù)。

var list=document.getElementById('mylist'); var members=['羅納爾多','半澤直樹(shù)','費(fèi)德勒']; for (var i = 0; i < members.length; i++) {var element=document.createElement('li');element.appendChild(document.createTextNode(members[i]));list.appendChild(element); };

如何改進(jìn)這個(gè)代碼呢,我們只要緩存一下for循環(huán)中頻繁創(chuàng)建的li元素就可以了,看一下下面代碼。

var list=document.getElementById('mylist'),members=['羅納爾多','半澤直樹(shù)','費(fèi)德勒'],fragment = document.createDocumentFragment(),element;; for (var i = 0; i < members.length; i++) {element=document.createElement('li');element.appendChild(document.createTextNode(members[i]));fragment.appendChild(element); }; list.appendChild(fragment);

拼接string

js的字符串拼接直接用+號(hào)就可以了。但是下面的情況有更好的方法。

var newPageBuild = [ "<!DOCTYPE html>", "<html>", "<body>", "<h1>", //***a hundred or more other html elements***, "</script>", "</body>", "</html>" ]; var page = ""; for(var i = 0, x = newPageBuild.length; i < x; i++){ page += newPageBuild[i]; }

上面這段代碼可以這樣改進(jìn)

page = newPageBuild.join("\n");

如何測(cè)試性能

瀏覽器提供了很多工具測(cè)試性能,這里分享一個(gè)用代碼簡(jiǎn)單測(cè)試性能的方法。

var SpeedTest = function(testImplement,testParams,repetitions) {this.testImplement = testImplement;this.testParams = testParams;this.repetitions = repetitions || 10000;this.average = 0; };SpeedTest.prototype = {startTest: function() {if (this.testImplement(this.testParams) === false) {alert('Test failed with those parameters.');return;}var beginTime, endTime, sumTimes = 0;for (var i = 0, x = this.repetitions; i < x; i++) {beginTime = +new Date();this.testImplement(this.testParams);endTime = +new Date();sumTimes += endTime - beginTime;}console.log('SumTimes execution across ' + sumTimes);this.average = sumTimes / this.repetitions;return console.log('Average execution across ' + this.repetitions + ': ' + this.average);} };

我們看到SpeedTest類的構(gòu)造函數(shù)有三個(gè)參數(shù),第一個(gè)參數(shù)是需要測(cè)試的函數(shù),第二個(gè)參數(shù)是被測(cè)試函數(shù)的參數(shù),第三個(gè)是重復(fù)的次數(shù)。SpeedTest原型中定義了一個(gè)方法startTest,用來(lái)測(cè)試運(yùn)行的時(shí)間,最后打印出運(yùn)行總時(shí)間和平均時(shí)間。我們來(lái)看看如何使用它。

function LoopGood(){ var footballTeam={coach:"xiaohu",members:['羅納爾多','半澤直樹(shù)','費(fèi)德勒']};var members = footballTeam.members;for (var i = 0, Length = footballTeam.members.length; i < Length ; i++) {console.log(members[i])}; } var speed = new SpeedTest(LoopGood,null,10000); speed.startTest();

使用起來(lái)也很方便吧。

轉(zhuǎn)載于:https://www.cnblogs.com/xiaohu1986/p/5204190.html

總結(jié)

以上是生活随笔為你收集整理的优化JS代码性能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。