【深入了解JavaScript的内存与性能问题】本篇文章给大家带来了关于javascript的相关知识 , 其中主要介绍了JavaScript的内存与性能问题 , 包括了如何解决类似按钮过多的问题、删除事件处理程序等等 , 希望对大家有帮助 。
![深入了解JavaScript的内存与性能问题](http://img.zhejianglong.com/220407/0606453256-0.jpg)
文章插图
相关推荐:javascript教程
一、何为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 =https://www.52zixue.com/zhanzhang/webqd/js/04/07/69051/> '${value} ').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事件) , 通过它处理页面中所有某种类型的事件 。 这意味着只要页面渲染出可点击的元素 , 就可以无延迟的起作用 。
节省花在设置页面事件程序上的事件 。
减少整个页面所需的内存 , 提升整体性能 。
导致这个问题的原因有两个:
1、删除带有事件处理程序的元素比如通过的DOM方法removeChild()或replaceChild()删除节点 。 最常见的还是使用innerHTML整体替换页面的某一部分 。 这时候 , 被innerHTML删除的元素上如果有事件处理程序 , 也不会被垃圾收集程序正常清理 。
所以 , 如果在得知某个元素会被删除之前 , 应手动删除它的事件处理程序 , 比如
btn.onclick = null;//删除事件处理程序
, 事件委托也有助于解决这个问题 , 如果得知某个元素要被innerHTML替代的时候 , 就不要给该元素添加事件处理程序了 , 将其添加到更高层级的节点上即可 。
推荐阅读
- 带你学习JavaScript中的File API、Streams API和Web Cryptography API
- 完全掌握JavaScript之DOM与BOM的区别与用法
- 引用javascript文件要不要包含在script标签中
- QQ飞车手游S18赛季时间-S18赛季什么时候开始您需要了解的
- 光遇8月24日每日任务攻略-8月24日每日任务流程详解您需要了解的
- 怎么从丢失的分区中恢复文件?分区删除了怎么恢复文件?新系统了解的东西
- 剑网3七夕盒子2020怎么样-2020七夕盒子比翼相思外观介绍您需要了解的
- 帕斯卡契约黑雾通关心得-黑雾通关及方法详解您需要了解的
- 如何看手相了解女人出轨
- 电脑中怎么输入顿号破折号省略号等符号?新系统了解的东西