JS哪些操作會造成內存泄露


1,js的垃圾回收

JavaScript垃圾回收的機制很簡單:找出不再使用的變量,然后釋放掉其占用的內存,但是這個過程不是實時的,因為其開銷比較大,所以垃圾回收系統(GC)會按照固定的時間間隔,周期性的執行。

 

2,回收機制

  1. 全局變量不會被回收。

  2. 局部變量會被回收,也就是函數一旦運行完以后,函數內部的東西都會被銷毀。

  3. 只要被另外一個作用域所引用就不會被回收

 

3,回收方法

  1. 標記清除,在局部變量創建時,會被標記為進入環境標記,這個時候是不會回收的,當函數執行完畢之后,標記會被標記為離開環境,這個時候就會被清除
  2. 引用計數,在一個變量被創建時,每次被引用就會標記引用次數+1,一旦不再使用時引用次數-1,當檢測到引用次數為0時,清除

 

4,什么是內存泄漏,什么情況下會產生

   是什么:

        因為一些代碼操作導致一些需要回收的內容不符合回收機制,導致沒有被回收

 

   怎么產生

    1,意外全局變量

function aa(){
   bb=15
}

 

原因:  原本屬於局部變量的bb,由於沒有寫var,在非嚴格模式下會被認為是全局變量,即window.bb===15//true ,全局變量不會被回收

解決辦法:使用嚴格模式

    

     2,閉包引起的內存泄漏

function aa(){
    let i=10
    return function(){
        console.log(i)
    }
}

let b=aa()

 

原因:閉包實際上就是在外部函數讀取函數內部的變量,這就導致內部變量被其他作用引用,無法回收

解決:解除閉包

詳情:閉包

 

 

     3,被遺忘的計時器 / 回調函數

 

a,簡單粗暴,setInterval()這個函數若沒有設計停止機制的話,它是會一直執行下去的

let a=[]
setInterval(function(){ a.push(1) })

 

 

 b,回調函數

老版本的ie無法檢測到Dom節點之間的循環引用,會導致內存泄漏(新瀏覽器不會)

let element=document.getElementById('button')

function onClick(){
    element.innerHtml='text'
}

element.addEventListener('click',onClick)

 

 

     4,dom的引用

當我們引用一個dom元素

let gogo=document.getElementByid('gogo')

 

在dom的刪除時候,直接操作dom去刪除我們想刪的dom對象

document.body.removeChild(document.getElementByid('gogo'))

 

那么現在我們通過引用來的gogo對象則不會被回收

 

 

 

 

 

 

 

 

 

 

 

標記清除


免責聲明!

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



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