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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM