前端如何正确的添加、销毁全局事件监听

本文详细讲解了在前端开发中,如何正确地添加和销毁全局事件监听,避免内存泄露和性能问题。重点介绍了addEventListener的使用技巧,包括参数设置、匿名函数的避免,以及监听器的适时销毁。

在前端编码中,经常会通过addEventListener来添加全局的事件监听,但是,这种全局的事件监听方法若使用不当,很容易造成严重的性能问题,下面我就来说一下如何正确的添加和销毁全局的事件监听。

添加

1、element.addEventListener的使用方法

这里我就不多啰嗦了,网上已经讲的很明白了,下面附上链接。

https://www.runoob.com/jsref/met-element-addeventlistener.html

2、window.addEventListener和document.addEventListener

我们知道,document是window下的一个对象,一般情况下,这两个都可以添加全局的事件监听,区别就是,执行的顺序会不太一样。

如果addEventListener没有第三个参数或第三个参数为false的话,也就是说在冒泡阶段执行,document.addEventListener的绑定事件会先于window.addEventListener的绑定事件执行。

若addEventListener的第三个参数为true的话,也就是说在捕获阶段执行,window.addEventListener的绑定事件会先于document.addEventListener的绑定事件执行。

这个应该比较好理解,就是捕获和冒泡的事件执行顺序的区别。

3、不使用匿名函数

下面我列举两种添加事件监听的写法:

function handleClick () {
    alert('hello!')
}

// 第一种
document.addEventListener('click', handleClick)

// 第二种
document.addEventListener('click', () => {
    alert('hello!')
})

这两种写法看起来没有什么大的区别,也都能实现同样的效果,但实际上第二种写法是错误的,一旦把这种匿名函数添加到全局的事件监听当中,会导致无法销毁这个监听事件。

原因也很简单,函数名会作为销毁监听事件时的索引,但是匿名函数没有函数名,所以我们也就无法获得其索引,也就无法销毁此监听事件。

销毁

1、参数与创建时要一致

还是先举两个例子:

// 正确
document.addEventListener('click', handleClick, true)
document.removeEventListener('click', handleClick, true)

document.addEventListener('resize', handleResize)
document.removeEventListener('resize', handleResize)

// 错误
document.addEventListener('click', handleClick, true)
document.removeEventListener('click', handleClick)

创建和销毁时传入的三个参数要完全一致,否则无法无法销毁。

2、注意第二个参数的有效性

这是什么意思呢?

在项目中,一个常见的场景就是:在页面进入后创建监听事件,并在页面离开后把这个监听销毁掉。

那么当页面销毁时,伴随着页面的一些方法很可能也跟着销毁或者改变了,当这时我们再去销毁事件监听时,实际上方法已经取不到了,但我们却浑然不知,举个例子:

let handleClick = () => {
    alert('Hello!')
}

document.addEventListener('click', handleClick)

handleClick = () => {
    alert('World!')
}

document.removeEventListener('click', handleClick)

例子比较简陋,就是希望大家能明白,添加和销毁时的方法一定要是同一个方法,确保没有被销毁或改变。

总结

其实写这篇文章,添加监听器的使用我是不太担心的,因为使用方法非常简单。但好多人都没有及时销毁监听器的意识或不会正确的销毁监听器,这样做导致的直接后果就是内存泄露。

说到内存泄露,有些人可能会质疑,一个小小的监听器能占用多少内存?

譬如说一个Vue的组件,全局的监听器引用了Vue实例里的方法,那么当这个Vue组件不在使用的时候,因为Vue实例内部的方法被引用,所以就导致Vue实例占用的内存无法被释放,而这个组件内部的数据可能很多,还有可能引用了其他的组件等等,最终就回导致严重的内存泄露,产生严重的性能问题。

我不是在危言耸听,我参与的半数以上的项目都会遇到因某些开发者粗心大意或意识不够强,没有正确的销毁监听器而引起的内存泄露,有些网页在短时间操作后,其内存占用甚至能从十几MB飙升至上百MB,有上百个全局的监听事件。

我希望所有的前端开发者能有这样一个意识,在项目开发的过程中,不时的关注一下页面的性能问题,谷歌浏览器提供了两个很好的工具,通过控制台的Memory和Performance,我们能轻松的观察、分析页面的内存使用情况和性能。后面我会简单介绍一下这两个工具的使用。

内容概要:本文深入研究了基于最优滑模控制的永磁同步电机(PMSM)调速系统模型,重点利用Simulink工具搭建并仿真了该控制系统的动态响应特性。文章系统阐述了最优滑模控制策略的设计原理,突出其在削弱传统滑模控制固有抖振现象、增强系统鲁棒性方面的显著优势。通过与传统滑模控制方法的对比实验,充分验证了所提出方法在调速精度、抗外部干扰能力以及动态响应速度等方面的优越性能。研究内容涵盖PMSM数学建模、滑模面构造、最优控制律推导、Lyapunov稳定性分析、参数整定及Simulink仿真验证等完整环节,形成了一套严谨的控制算法设计与实现流程。; 适合人群:具备自动控制原理、现代控制理论基础和MATLAB/Simulink仿真操作能力,从事电机驱动控制、电力电子与电力传动、运动控制或自动化等相关领域研究的工程技术人员及高校研究生。; 使用场景及目标:① 深入掌握滑模控制理论及其在高性能电机调速系统中的具体应用方法;② 学习如何设计并实现能够有效抑制抖振的最优滑模控制器,以提升系统整体鲁棒性和控制品质;③ 利用Simulink平台独立完成从理论建模到仿真验证的全过程,服务于科研课题、课程设计或实际工程项目。; 阅读建议:建议读者务必结合MATLAB/Simulink环境动手复现文中模型,重点关注滑模切换面的设计准则、控制律的数学推导过程以及控制器参数的调节规律,并通过施加不同的负载扰动、设定多种转速指令等方式全面测试系统的动态与稳态性能,从而深刻理解最优滑模控制的核心机理与工程应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值