0

0

深入了解JavaScript的内存与性能问题

WBOY

WBOY

发布时间:2022-03-31 11:44:47

|

2445人浏览过

|

来源于CSDN

转载

本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了javascript的内存与性能问题,包括了如何解决类似按钮过多的问题、删除事件处理程序等等,希望对大家有帮助。

深入了解JavaScript的内存与性能问题

相关推荐:javascript教程

一、何为JavaScript内存与性能

因为事件处理程序在现代web应用中可以实现交互,所以很多开发者都会错误地在页面中大量使用它们,在JavaScript中,页面中事件处理程序的数量与页面整体性能直接相关。原因有很多,比如①每个函数都是对象,都要占用内存空间,对象越多,性能越差;②为指定事件处理程序所需访问DOM的次数会先造成整个页面交互的延迟。

二、谈谈关于innerHTML的性能问题?

1、使用innerHTML的反面教材

for(let value of values){
	ul.innerHTML += '
  • ${value}
  • ';}

    这段代码效率低,因为每次迭代都要设置一次innerHTML,不仅如此,每次循环都要先读取innerHTML,也就是说一次循环要访问两次innerHTML。

    立即学习Java免费学习笔记(深入)”;

    2、如何解

    let itemsHtml = "";for(let value of values){
    	itemsHtml  += '
  • ${value}
  • ';}ul.innerHTML = itemsHtml;

    这样修改之后,效率就高多了,只会对innerHTML进行一次赋值,下面代码也可以搞定:
    ul.innerHTML = values.map(value => '

  • ${value}
  • ').join(' ');

    三、如何解决类似按钮过多问题?

    过多事件处理程序的解决方案是使用事件委托。事件委托利用事件冒泡,可以只使用一个事件处理程序来管理一种类型的事件。例如,click事件冒泡到document。这意味着可以为整个页面指定一个onclick事件处理程序,而不是为每个可点击元素分别指定事件处理程序。

    • 比比东
    • 云韵
    • 美杜莎

    这里包含三个列表项,在被点击时应该执行某个操作,通常的方式是指定三个事件处理程序:

    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事件),通过它处理页面中所有某种类型的事件。这意味着只要页面渲染出可点击的元素,就可以无延迟的起作用。

    • 节省花在设置页面事件程序上的事件。

      住哪API酒店+租车源码包
      住哪API酒店+租车源码包

      数据本地化解决接口缓存数据无限增加,读取慢的问题,速度极大提升更注重SEO优化优化了系统的SEO,提升网站在搜索引擎的排名,增加网站爆光率搜索框本地化不用远程读取、IFRAME调用,更加容易应用及修改增加天气预报功能页面增加了天气预报功能,丰富内容增加点评和问答页面增加了点评和问答相关页面,增强网站粘性电子地图优化优化了电子地图的加载速度与地图功能酒店列表增加房型读取酒店列表页可以直接展示房型,增

      下载
    • 减少整个页面所需的内存,提升整体性能。

    五、删除事件处理程序

    把事件处理程序指定给元素后,在浏览器代码和负责页面交互的JavaScript代码之间就建立了联系。这种联系简历越多,页面性能就越差。除了通过事件委托来限制这种连接之外,还应该及时删除不用的事件处理程序。很多web应用性能不佳都是由于无用的事件处理程序长驻内存导致的。
    导致这个问题的原因有两个:

    1、删除带有事件处理程序的元素

    比如通过的DOM方法removeChild()或replaceChild()删除节点。最常见的还是使用innerHTML整体替换页面的某一部分。这时候,被innerHTML删除的元素上如果有事件处理程序,也不会被垃圾收集程序正常清理。
    所以,如果在得知某个元素会被删除之前,应手动删除它的事件处理程序,比如btn.onclick = null;//删除事件处理程序,事件委托也有助于解决这个问题,如果得知某个元素要被innerHTML替代的时候,就不要给该元素添加事件处理程序了,将其添加到更高层级的节点上即可。

    2、页面卸载也会导致内存中残留引用的问题

    如果在页面卸载后事件处理程序没有被清理,则它们仍然会残留在内存中。之后,浏览器每次加载和卸载页面(比如通过前进、后退或刷新),内存中残留对象的数量都会增加,这是因为事件处理程序不会被回收。
    一般来说,最好在onunload事件处理程序中趁页面尚未卸载先删除所有事件处理程序。这时候也能体现出事件委托的优势,因为事件处理程序少,所以容易记住删除哪些。

    六、如何解决循环中动态添加p,造成的死循环问题?

    表达式

    let ps = document.getElementsByTagName("p");for(let i = 0;i

    表达式

    let ps = document.getElementsByTagName("p");for(let i = 0,len=ps.length;i

    表达式①中第一行取得了包含文档中所有

    元素的HTMLCollection。因为这个集合是实时的,所以任何时候只要向页面中添加一个新的

    元素,再查询这个集合就会多一项。因为浏览器不希望保存每次创建的集合,所以就会在每次访问时更新集合。每次循环都会求值i ,这意味着要获取所有

    元素的查询。因为循环体中创建并向文档中添加一个新的

    元素,所以每次循环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教程

    相关文章

    数码产品性能查询
    数码产品性能查询

    该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

    下载

    相关标签:

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    ip地址修改教程大全
    ip地址修改教程大全

    本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

    33

    2025.12.26

    压缩文件加密教程汇总
    压缩文件加密教程汇总

    本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

    18

    2025.12.26

    wifi无ip分配
    wifi无ip分配

    本专题整合了wifi无ip分配相关教程,阅读专题下面的文章了解更多详细教程。

    46

    2025.12.26

    漫蛙漫画入口网址
    漫蛙漫画入口网址

    本专题整合了漫蛙入口网址大全,阅读下面的文章领取更多入口。

    91

    2025.12.26

    b站看视频入口合集
    b站看视频入口合集

    本专题整合了b站哔哩哔哩相关入口合集,阅读下面的文章查看更多入口。

    283

    2025.12.26

    俄罗斯搜索引擎yandex入口汇总
    俄罗斯搜索引擎yandex入口汇总

    本专题整合了俄罗斯搜索引擎yandex相关入口合集,阅读下面的文章查看更多入口。

    370

    2025.12.26

    虚拟号码教程汇总
    虚拟号码教程汇总

    本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

    35

    2025.12.25

    错误代码dns_probe_possible
    错误代码dns_probe_possible

    本专题整合了电脑无法打开网页显示错误代码dns_probe_possible解决方法,阅读专题下面的文章了解更多处理方案。

    25

    2025.12.25

    网页undefined啥意思
    网页undefined啥意思

    本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

    72

    2025.12.25

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    React 教程
    React 教程

    共58课时 | 3万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 1.8万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 2.6万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号