js 闭包的内存泄漏解决方法

2020-10-21  本文已影响0人  小李不小

什么是内存泄露?

本质上,内存泄露可以定义为:应用程序不再需要占用内存的时候,由于某些原因,内存没有被操作系统或可用内存池回收。编程语言管理内存的方式各不相同。只有开发者最清楚哪些内存不需要了,操作系统可以回收。一些编程语言提供了语言特性,可以帮助开发者做此类事情。另一些则寄希望于开发者对内存是否需要清晰明了。

三种类型的常见 JavaScript 内存泄露

1 存在内存泄露问题的代码

循环p元素的时候,会在存在中产生一个副本p,不销毁的,会一直存在于内中,造成占内存。

####html
<p class="example1">使用 class="example1" 的标题</p>
<p class="example">使用 class="example" 的段落</p> 

####js
let ps=document.querySelectorAll('p')
ps.forEach(function(item){

    item.addEventListener('click',function(){
                let cls=item.getAttribute('class');
        // console.log(item.getAttribute('class'));
        console.log(cls)
    })
})

2 优化方案

当循环开始,把想要获取的class 用变量保存起来,然后等循环结束之后,把内存的副本p清空掉,这样副本就不会存在,然后获取class也不会手影响。

####html
<p class="example1">使用 class="example1" 的标题</p>
<p class="example">使用 class="example" 的段落</p> 

####js
let ps=document.querySelectorAll('p')
ps.forEach(function(item){  //循环地址,会在内存中复制一个p的副本,相当于存在两种p元素了
let cls=item.getAttribute('class');
    item.addEventListener('click',function(){
        // console.log(item.getAttribute('class'));
        console.log(cls)
    })
    item=null
})

效果图

image.png
上一篇下一篇

猜你喜欢

热点阅读