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>