深入了解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的内存与性能问题的详细内容 , 更多请关注电脑自学网其它相关文章!

推荐阅读