欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于JavaScript的內(nèi)存與性能問題解決匯總

 更新時間:2022年04月07日 08:52:46   作者:哪?吒  
這篇文章主要介紹了關(guān)于JavaScript的內(nèi)存與性能問題解決匯總,在JavaScript中,頁面中事件處理程序的數(shù)量與頁面整體性能直接相關(guān),原因有很多,下面就一起來看看具體的總結(jié)吧

一、何為JavaScript內(nèi)存與性能

因為事件處理程序在現(xiàn)代web應(yīng)用中可以實現(xiàn)交互,所以很多開發(fā)者都會錯誤地在頁面中大量使用它們,在JavaScript中,頁面中事件處理程序的數(shù)量與頁面整體性能直接相關(guān)。原因有很多,比如①每個函數(shù)都是對象,都要占用內(nèi)存空間,對象越多,性能越差;②為指定事件處理程序所需訪問DOM的次數(shù)會先造成整個頁面交互的延遲。

二、談?wù)勱P(guān)于innerHTML的性能問題?

1、使用innerHTML的反面教材

for(let value of values){
?? ?ul.innerHTML += '<li>${value}</li>';
}

這段代碼效率低,因為每次迭代都要設(shè)置一次innerHTML,不僅如此,每次循環(huán)都要先讀取innerHTML,也就是說一次循環(huán)要訪問兩次innerHTML。

2、如何解決

let itemsHtml = "";
for(let value of values){
?? ?itemsHtml ?+= '<li>${value}</li>';
}
ul.innerHTML = itemsHtml;

這樣修改之后,效率就高多了,只會對innerHTML進行一次賦值,下面代碼也可以搞定:

ul.innerHTML = values.map(value => '<li>${value}</li>').join(' ');

三、如何解決類似按鈕過多問題?

過多事件處理程序的解決方案是使用事件委托。事件委托利用事件冒泡,可以只使用一個事件處理程序來管理一種類型的事件。例如,click事件冒泡到document。這意味著可以為整個頁面指定一個onclick事件處理程序,而不是為每個可點擊元素分別指定事件處理程序。

<ul id="myGirls">
?? ?<li id="girl1">比比東</li>
?? ?<li id="girl2">云韻</li>
?? ?<li id="girl3">美杜莎</li>
</ul>

這里包含三個列表項,在被點擊時應(yīng)該執(zhí)行某個操作,通常的方式是指定三個事件處理程序:

let item1 = document.getElementById("girl1");
let item2 = document.getElementById("girl2");
let item3 = document.getElementById("girl3");

item1.addEventListener("click",(event) => {
?? ?console.log("我是比比東!");
})

item2.addEventListener("click",(event) => {
?? ?console.log("我是云韻!");
})

item3.addEventListener("click",(event) => {
?? ?console.log("我是美杜莎!");
})

相同代碼太多,代碼過于丑陋了。
使用事件委托,只要給多有元素的共同的祖先節(jié)點添加一個事件處理程序,就可以解決丑陋!

let list = document.getElementById("myGirls");
list.addEventListener("click",(event) => {
?? ?let target = event.target;
?? ?switch(target.id){
?? ??? ?case "girl1":
?? ??? ??? ?console.log("我是比比東!");
?? ??? ??? ?break;
?? ??? ?case "girl2":
?? ??? ??? ?console.log("我是云韻!");
?? ??? ??? ?break;
?? ??? ?case "girl3":
?? ??? ??? ?console.log("我是美杜莎!");
?? ??? ??? ?break;
?? ?}
})

四、事件委托的優(yōu)點有哪些?

document對象隨時可用,任何時候都可以為它添加一個事件處理程序(不用等待DOMContentLoaded或load事件),通過它處理頁面中所有某種類型的事件。這意味著只要頁面渲染出可點擊的元素,就可以無延遲的起作用。
節(jié)省花在設(shè)置頁面事件程序上的事件。
減少整個頁面所需的內(nèi)存,提升整體性能。

五、刪除事件處理程序

把事件處理程序指定給元素后,在瀏覽器代碼和負(fù)責(zé)頁面交互的JavaScript代碼之間就建立了聯(lián)系。這種聯(lián)系簡歷越多,頁面性能就越差。除了通過事件委托來限制這種連接之外,還應(yīng)該及時刪除不用的事件處理程序。很多web應(yīng)用性能不佳都是由于無用的事件處理程序長駐內(nèi)存導(dǎo)致的。

導(dǎo)致這個問題的原因有兩個:

1、刪除帶有事件處理程序的元素

比如通過的DOM方法removeChild()replaceChild()刪除節(jié)點。最常見的還是使用innerHTML整體替換頁面的某一部分。這時候,被innerHTML刪除的元素上如果有事件處理程序,也不會被垃圾收集程序正常清理。
所以,如果在得知某個元素會被刪除之前,應(yīng)手動刪除它的事件處理程序,比如btn.onclick = null;//刪除事件處理程序,事件委托也有助于解決這個問題,如果得知某個元素要被innerHTML替代的時候,就不要給該元素添加事件處理程序了,將其添加到更高層級的節(jié)點上即可。

2、頁面卸載也會導(dǎo)致內(nèi)存中殘留引用的問題

如果在頁面卸載后事件處理程序沒有被清理,則它們?nèi)匀粫埩粼趦?nèi)存中。之后,瀏覽器每次加載和卸載頁面(比如通過前進、后退或刷新),內(nèi)存中殘留對象的數(shù)量都會增加,這是因為事件處理程序不會被回收。
一般來說,最好在onunload事件處理程序中趁頁面尚未卸載先刪除所有事件處理程序。這時候也能體現(xiàn)出事件委托的優(yōu)勢,因為事件處理程序少,所以容易記住刪除哪些。

六、如何解決循環(huán)中動態(tài)添加div,造成的死循環(huán)問題?

表達(dá)式①

let divs = document.getElementsByTagName("div");
for(let i = 0;i<divs.length;++i){
?? ?let div = document.createElement("div");
?? ?document.body.appendChild(div);
}

表達(dá)式②

let divs = document.getElementsByTagName("div");
for(let i = 0,len=divs.length;i<len;++i){
?? ?let div = document.createElement("div");
?? ?document.body.appendChild(div);
}

表達(dá)式①中第一行取得了包含文檔中所有<div>元素的HTMLCollection。因為這個集合是實時的,所以任何時候只要向頁面中添加一個新的<div>元素,再查詢這個集合就會多一項。因為瀏覽器不希望保存每次創(chuàng)建的集合,所以就會在每次訪問時更新集合。每次循環(huán)都會求值i < divs.length,這意味著要獲取所有<div>元素的查詢。因為循環(huán)體中創(chuàng)建并向文檔中添加一個新的<div>元素,所以每次循環(huán)divs.length的值也會遞增。因為兩個值都會遞增,所以i永遠(yuǎn)不會等于divs.length,因此表達(dá)式①會造成死循環(huán)。
而表達(dá)式②中,又初始化了一個保存集合長度的變量len,因為len保存著循環(huán)開始集合的長度,而這個值不會隨集合增大動態(tài)增長(for循環(huán)中初始化變量處只會初始化一次),所以就可以避免表達(dá)式①中出現(xiàn)的無窮循環(huán)問題。

如果不想初始化一個變量,也可以使用反向迭代:

表達(dá)式③

let divs = document.getElementsByTagName("div");
for(let i = divs.length-1;i>=0;--i){
?? ?let div = document.createElement("div");
?? ?document.body.appendChild(div);
}

七、JavaScript思維導(dǎo)圖

到此這篇關(guān)于關(guān)于JavaScript的內(nèi)存與性能問題解決匯總的文章就介紹到這了,更多相關(guān)JS內(nèi)存與性能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js兼容標(biāo)準(zhǔn)的表格變色效果

    js兼容標(biāo)準(zhǔn)的表格變色效果

    符合標(biāo)準(zhǔn)的表格變色的js代碼
    2008-06-06
  • javascript實現(xiàn)PC網(wǎng)頁里的拖拽效果

    javascript實現(xiàn)PC網(wǎng)頁里的拖拽效果

    這篇文章主要介紹了javascript實現(xiàn)PC網(wǎng)頁里的拖拽效果的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 判斷是否是IE6版本并給出提示升級瀏覽器

    判斷是否是IE6版本并給出提示升級瀏覽器

    一個與瀏覽器有關(guān)的腳本 ,也是大家從事WEb前端編程常見的編程技巧,就是判斷瀏覽器的版本,如果發(fā)現(xiàn)版本不符合你的設(shè)計要求,就給出提示升級瀏覽器,這樣你的網(wǎng)頁會更有體驗。
    2010-06-06
  • JavaScript常用工具方法封裝

    JavaScript常用工具方法封裝

    今天小編就為大家分享一篇關(guān)于JavaScript常用工具方法封裝,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 代碼生成器 document.write()

    代碼生成器 document.write()

    代碼生成器 document.write()...
    2007-04-04
  • 利用JavaScript編寫一個花里胡哨的點擊按鈕

    利用JavaScript編寫一個花里胡哨的點擊按鈕

    這篇文章主要介紹了如何利用HTML+CSS+JavaScript制作一個花里胡哨的點擊按鈕。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-03-03
  • js中最容易被忽視的事件問題大總結(jié)

    js中最容易被忽視的事件問題大總結(jié)

    下面小編就為大家?guī)硪黄猨s中最容易被忽視的事件問題大總結(jié)。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-05-05
  • 封裝獲取dom元素的簡單實例

    封裝獲取dom元素的簡單實例

    下面小編就為大家?guī)硪黄庋b獲取dom元素的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • JavaScript實現(xiàn)數(shù)組隨機排序的方法

    JavaScript實現(xiàn)數(shù)組隨機排序的方法

    這篇文章主要介紹了JavaScript實現(xiàn)數(shù)組隨機排序的方法,涉及javascript數(shù)組遍歷與排序的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • JavaScript?TWaver使用中間點畫折線的方法

    JavaScript?TWaver使用中間點畫折線的方法

    這篇文章主要介紹了JavaScript?TWaver使用中間點畫折線的方法,TWaver的圖形組件庫中提供了拓?fù)浣M件、地圖組件、設(shè)備圖組件,以及表格、樹圖、屬性表、圖表等豐富的通用圖形界面組件
    2022-07-07

最新評論