一篇文章带你搞懂JS对象的自我销毁

原创 前端开发者 随笔 前端 75阅读 12 天前 举报

在日常的JS组件开发中,往往会有一些较为复杂的DOM操作及事件监听,尤其是在处理UI层面的widgets时候更为明显。常常会花很多精力在对象的init上,而当组件需要被移除时则仅仅是把所在DOM草草的remove掉就算完事儿。

当然,绝大多数情况这样处理并没有什么不妥,因为事件监听时仅仅局限于所属的DOM自身,移除DOM后,只要对象的外部引用不再维系,相关的内存占用很快就会被当作垃圾回收掉(本文不讨论低版本 IE 内存回收的 BUG)。

其实个人在构建组件(对象)的时候是比较习惯于添加自定义方法destroy,用来手动销毁对象内部的一些引用。也就是今天要说的仅靠移除DOM并不能达到销毁对象的几种情况。

当你的组件出现下面几种情况时需要特别注意。

一: DOM事件监听越界
常规情况下,一个组件需要监听的仅仅是自身的DOM内的事件。偶尔也会有另一种情况,对象不得不操作自身之外的DOM。

拿常见的瀑布流组件为例,除了自身事件,还要监听页面的滚动、浏览器尺寸重置等事件。因此当瀑布流组件需要被移除时,简单的移除自身DOM并不能完整销毁组件对页面的影响。

下面是常规做法的例子:

上面的例子很明显,移除DOM后遗留的事件监听还在,回调内对组件的引用会导致整个组件常驻内存无法被回收,直至页面卸载。

不过你可能会说,在移除DOM时顺手解除下事件绑定就 OK 啦。事实确实如此,但是如果操作的具体细节让调用者实现就有点儿麻keng烦die了。因此我们需要提供一个destroy接口让调用者去解除对窗口滚动等事件的监听。

给大家推荐一个技术交流学习圈,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。获取资料👈👈👈
对web开发技术感兴趣的同学,可以加入👉👉👉交流圈👈👈👈,不管你是小白还是大牛都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。

二:JS 生命周期过长
一部分场景下,某段 JS 会在整个生命周期中反复被调用。比如轮播图自动播放,倒计时时钟的重绘。无论是使用setInterval不断调取,或者是 setTimeout递归延时。这两者在对象自身DOM被移除时同样不会随之被清除。因此也需要对象在被销毁时手动解除定时器。

三:DOM 之外的异步事件
比较常见的情形就是 ajax。当一个请求结束之前对象被销毁,ajax 返回后的操作无需继续进行。也有一定风险因为 dom 已被移除导致操作报错。

以渲染数据为例,ajax部分使用jquery:

上面例子中,destroy方法内部移除DOM只是为了说明方便,实际开发中一般不会这么做,只要做到移除元素完不成的那部分任务即可。

以上就是总结的对象销毁时需要额外注意的三种情况,当然还有其他更多情况,但大体与之类似。

让代码有自我意识,从学会自我销毁开始。

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复