JavaScript中的内存溢出与内存泄漏

内存溢出

是一种程序运行出现的错误; 当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误

var obj = {}
for (var i = 0; i < 100000; i++) {
  obj[i] = new Array(10000000)
}
console.log('------')

 

 

 

内存泄露

占用的内存没有及时释放; 内存泄露积累多了就容易导致内存溢出

常见的内存泄露意外的全局变量

function fn () {
  b = new Array[1000000]
  a = [] //不小心没有var定义,这时候a变量是全局的
}
fn()

常见的内存泄露没有及时清理的计时器或回调函数

// 没有及时清理的计时器
var intervalId = setInterval(function  () {
  console.log('----')
}, 1000)

clearInterval(intervalId) // 及时清理计时器

常见的内存泄露闭包

函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长,容易造成内存泄露

解决办法就是能不用闭包就不用,及时释放

function fn1() {
  var arr = new Array[100000];
  function fn2() {
    console.log(arr.length)
  }
  return fn2;
}
var f = fn1();
f();
f();
f = null // 让内部函数成为垃圾对象,释放闭包

还有一个就是在IE6,7,8中的问题:由于 IE 的 JScript 对象和 DOM 对象使用不同的垃圾收集方式,因此闭包在 IE 中会导致一些问题。就是内存泄漏的问题,也就是无法销毁驻留在内存中的元素。

<body>
    <div id="oDiv">Lee</div>
</body>
</html>
<script type="text/javascript">
    function box() {
        var oDiv = document.getElementById('oDiv'); //oDiv 用完之后一直驻留在内存
        oDiv.onclick = function () {
            alert(oDiv.innerHTML);           //这里用 oDiv 导致内存泄漏
        };
    }
    box();
</script>

那么在最后应该将 oDiv 解除引用来避免内存泄漏。

<body>
    <div id="oDiv">Lee</div>
</body>
</html>
<script type="text/javascript">
    function box() {
        var oDiv = document.getElementById('oDiv'); 
        var text = oDiv.innerHTML;
        oDiv.onclick = function () {
            alert(text);
        };
        oDiv = null;       //解除引用,等待垃圾回收
        alert(oDiv);       //null,说明已经不存在了
    }
    box();
</script>

 

posted @ 2019-05-07 04:21  胡椒粉hjf  阅读(2918)  评论(0编辑  收藏  举报