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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

精通JavaScript?关于JavaScript的内存与性能问题,你又了解多少呢?

發布時間:2023/12/10 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 精通JavaScript?关于JavaScript的内存与性能问题,你又了解多少呢? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 一、何為JavaScript內存與性能
    • 二、談談關于innerHTML的性能問題?
      • 1、使用innerHTML的反面教材
      • 2、如何解決
    • 三、如何解決類似按鈕過多問題?
    • 四、事件委托的優點有哪些?
    • 五、刪除事件處理程序
      • 1、刪除帶有事件處理程序的元素
      • 2、頁面卸載也會導致內存中殘留引用的問題
    • 六、如何解決循環中動態添加div,造成的死循環問題?
      • 表達式①
      • 表達式②
      • 表達式③
    • 七、JavaScript思維導圖
    • 八、關注公眾號哪吒編程,回復1024,獲取Java學習資料,還有不定期的送書活動

一、何為JavaScript內存與性能

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

二、談談關于innerHTML的性能問題?

1、使用innerHTML的反面教材

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

這段代碼效率低,因為每次迭代都要設置一次innerHTML,不僅如此,每次循環都要先讀取innerHTML,也就是說一次循環要訪問兩次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>

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

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("我是美杜莎!"); })

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

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;} })

四、事件委托的優點有哪些?

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

    把事件處理程序指定給元素后,在瀏覽器代碼和負責頁面交互的JavaScript代碼之間就建立了聯系。這種聯系簡歷越多,頁面性能就越差。除了通過事件委托來限制這種連接之外,還應該及時刪除不用的事件處理程序。很多web應用性能不佳都是由于無用的事件處理程序長駐內存導致的。
    導致這個問題的原因有兩個:

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

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

    2、頁面卸載也會導致內存中殘留引用的問題

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

    六、如何解決循環中動態添加div,造成的死循環問題?

    表達式①

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

    表達式②

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

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

    表達式③

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

    七、JavaScript思維導圖

    八、關注公眾號哪吒編程,回復1024,獲取Java學習資料,還有不定期的送書活動

  • Java程序設計
  • HTML5 APP開發從入門到精通
  • Python技術手冊
  • 區塊鏈開發從入門到精通
  • 總結

    以上是生活随笔為你收集整理的精通JavaScript?关于JavaScript的内存与性能问题,你又了解多少呢?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 又欲又污又肉又黄短文 | 毛片基地在线观看 | 日韩操操操 | 最近免费高清mv | 国产91一区 | 亚洲视频高清 | 欧美xxxx×黑人性爽 | 强公把我次次高潮hd | 日韩精品在线观看AV | 97国产精品久久 | 免费久久精品视频 | 午夜大片 | 六月婷婷av | h视频免费在线观看 | 美女自拍偷拍 | 岛国av中文字幕 | 黄色日韩视频 | 3d动漫精品啪啪一区二区三区免费 | 97成人免费| 无遮挡的裸体按摩的视频 | 国产 一二三四五六 | 国产精品国产精品国产专区不片 | 91视频导航 | 捆绑调教sm束缚网站 | 成人激情站 | 亚洲理论在线观看 | 97xxxxx| 精品久久久久久久久久久aⅴ | 91国产丝袜在线播放 | 91免费视频网站 | 青草视频免费观看 | 五月天激情国产综合婷婷婷 | 欧美性生活 | 涩涩视频免费观看 | 一级网站在线观看 | 欧美日韩亚洲一区二区 | 成人在线视频网址 | 你懂的日韩 | 亚洲第一狼人区 | 成人免费黄 | 国产第二页 | 美女屁股眼视频网站 | 欧美日韩在线免费观看视频 | 黄色录像一级大片 | 5a毛片| 尤物国产视频 | 中日韩中文字幕一区二区 | 国产综合无码一区二区色蜜蜜 | 国产亚洲欧美日韩高清 | 精品人妻伦一二三区久久 | 不卡福利视频 | 欧美经典一区二区 | 国产超91| 亚洲男人的天堂网站 | 国产福利第一页 | 精品在线视频播放 | 国产午夜精品久久 | 伦理片波多野结衣 | 国产精品中文无码 | 九一福利视频 | 国产婷婷色一区二区在线观看 | 欧美性xxxx图片 | 国产一级二级三级 | 污视频网址在线观看 | 他揉捏她两乳不停呻吟动态图 | 青娱乐激情 | 国产又大又黄又粗 | jzjzz成人免费视频 | 欧美一级电影在线 | 豆花在线观看 | 美女网站黄页 | 一级成人黄色片 | 国产成人福利 | 国产精品啪 | 午夜激情av | 伊人365影院| 日韩视频一区二区三区在线播放免费观看 | 超碰伊人久久 | 青青啪啪| 欧美日韩国产综合网 | 色就是色欧美色图 | 无码日韩精品一区二区 | 二区不卡| 国产午夜手机精彩视频 | 国产裸体美女永久免费无遮挡 | wwwxxx黄色| 一级中文片 | 黄色网页免费观看 | 欧美黑人猛交 | 免费成人av片 | 日韩精品一区二 | 高潮毛片又色又爽免费 | 中文字幕黄色 | 亚洲爽妇网 | 亚洲国产成人精品91久久久 | 国产精品50页 | 蜜臀久久99静品久久久久久 | 乖疼润滑双性初h | 日韩av电影网 |