深入了解JavaScript的內存與性能問題( 二 )


2、頁面卸載也會導致內存中殘留引用的問題如果在頁面卸載后事件處理程序沒有被清理 , 則它們仍然會殘留在內存中 。 之后 , 瀏覽器每次加載和卸載頁面(比如通過前進、后退或刷新) , 內存中殘留對象的數量都會增加 , 這是因為事件處理程序不會被回收 。
一般來說 , 最好在onunload事件處理程序中趁頁面尚未卸載先刪除所有事件處理程序 。 這時候也能體現出事件委托的優勢 , 因為事件處理程序少 , 所以容易記住刪除哪些 。
六、如何解決循環中動態添加p , 造成的死循環問題?表達式let ps = document.getElementsByTagName("p");for(let i = 0;i<ps.length;++i){ let p = document.createElement("p"); document.body.appendChild(p);}表達式let ps = document.getElementsByTagName("p");for(let i = 0,len=ps.length;i<len;++i){ let p = document.createElement("p"); document.body.appendChild(p);}表達式①中第一行取得了包含文檔中所有<p>元素的HTMLCollection 。 因為這個集合是實時的 , 所以任何時候只要向頁面中添加一個新的<p>元素 , 再查詢這個集合就會多一項 。 因為瀏覽器不希望保存每次創建的集合 , 所以就會在每次訪問時更新集合 。 每次循環都會求值i < ps.length , 這意味著要獲取所有<p>元素的查詢 。 因為循環體中創建并向文檔中添加一個新的<p>元素 , 所以每次循環ps.length的值也會遞增 。 因為兩個值都會遞增 , 所以i永遠不會等于ps.length , 因此表達式①會造成死循環 。
而表達式②中 , 又初始化了一個保存集合長度的變量len , 因為len保存著循環開始集合的長度 , 而這個值不會隨集合增大動態增長(for循環中初始化變量處只會初始化一次) , 所以就可以避免表達式①中出現的無窮循環問題 。
如果不想初始化一個變量 , 也可以使用反向迭代:
表達式let ps = document.getElementsByTagName("p");for(let i = ps.length-1;i>=0;--i){ let p = document.createElement("p"); document.body.appendChild(p);}七、JavaScript思維導圖

深入了解JavaScript的內存與性能問題

文章插圖

相關推薦:javascript教程
以上就是深入了解JavaScript的內存與性能問題的詳細內容 , 更多請關注電腦自學網其它相關文章!

推薦閱讀