美文网首页
JS内存泄漏常见的情况

JS内存泄漏常见的情况

作者: 元气满满321 | 来源:发表于2017-08-14 17:01 被阅读72次

内存泄漏是指不能再使用的内存,没有及时释放

情况1.意外的全局变量

function leaks(){
        a = 3;
 }

当leaks函数执行完后,由于a是全局变量,所以还存在,没有及时释放。但在严格模式'user strict' 下,严格模式会阻止你创建意外的全局变量

情况2.闭包

function assignHandler(){
        let element = document.getElementById("someElement");
        element.onclick = function () {
            alert(element.id);
        };
    }

上面的匿名函数就是一个闭包,element元素被该闭包引用,因此无法减少对element的引用数。不过可以解决,如下

function assignHandler(){
        let element = document.getElementById("someElement");
        let id = element.id;
        element.onclick = function () {
            alert(id);
        };
        element = null;
    }

通过把element.id的一个副本保存在一个变量中,把element变量设置微null来删除对dom的引用。这样就可以减少对dom的引用数,从而正常回收其占用的内存

情况3.循环引用

循环引用 在引用计数策略下会导致内存泄漏,标记清除不会。
解决办法:手工解除循环引用。

function fn() {
 var a = {};
 var b = {};
 a.pro = b;
 b.pro = a;
} 
fn();

a和b的引用次数都是2,fn()执行完毕后,两个对象都已经离开环境。
在标记清除方式下是没有问题的,但是在引用计数策略下,a和b的引用次数不为0,不会被垃圾回收器回收内存。如果fn函数被大量调用,就会造成内存泄漏。

情况4

当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

<div id="myDiv">
    <input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
    var btn = document.getElementById("myBtn");
    btn.onclick = function(){
        document.getElementById("myDiv").innerHTML = "Processing...";
    }
</script>

这里,为了避免双击,单击按钮时将按钮移除并替换成一条消息,相信大家见过这种"操作"。但问题出在,当按钮从页面中移除时,它还带着一个事件处理程序呢
改成下面

<div id="myDiv">
    <input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
    var btn = document.getElementById("myBtn");
    btn.onclick = function(){
        btn.onclick = null;
        document.getElementById("myDiv").innerHTML = "Processing...";
    }
</script>

http://www.cnblogs.com/sprying/archive/2013/05/31/3109517.html

每天都努力一点点
谢谢你看完


相关文章

  • JS内存泄漏常见的情况

    内存泄漏是指不能再使用的内存,没有及时释放 情况1.意外的全局变量 当leaks函数执行完后,由于a是全局变量,所...

  • 记录电商公司面试

    面试记录 问了常见的内存泄漏常见有哪些 Handler的内存泄漏情况 activity,window,view之间...

  • Android内存泄漏相关

    问题1 内存泄漏的基本定义是什么?内存泄漏有什么危害?问题2 开发中常见的内存泄漏的情况有哪些?什么原因造成的?怎...

  • Xcode调试工具

    一.静态内存分析工具 编译阶段查找内存泄漏等问题 1.常见内存泄漏问题 常见的内存泄漏除了循环引用,CoreFou...

  • 常见内存泄漏情况梳理

    一、循环引用, 以两个实例为例,循环引用产生于两个实例都强引用的对方,而两个实例的释放都依赖于对方的释放,最终都无...

  • js内存泄漏常见的四种情况

    意外的全局变量 js中如果不用 var 声明变量,该变量将被视为 window 对象(全局对象)的属性,也就是全局...

  • iOS内存泄漏的常见情况

    iOS内存泄漏的常见情况 1.声明delegate为strong类型,简而言之,如果父VC持有子VC,并设置子VC...

  • iOS内存泄漏的常见情况

    iOS内存泄漏的常见情况 1.声明delegate为strong类型,简而言之,如果父VC持有子VC,并设置子VC...

  • iOS内存泄漏的常见情况

    iOS内存泄漏的常见情况 1.声明delegate为strong类型,简而言之,如果父VC持有子VC,并设置子VC...

  • Android性能优化 内存泄漏和内存溢出

    内存泄漏 内存溢出 常见的内存泄露场景 常见的内存溢出场景

网友评论

      本文标题:JS内存泄漏常见的情况

      本文链接:https://www.haomeiwen.com/subject/qjyurxtx.html