內存溢出
是一種程序運行出現的錯誤; 當程序運行需要的內存超過了剩余的內存時, 就出拋出內存溢出的錯誤
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>