Q: 什麼是內存泄露?瀏覽器
A:已經再也不使用的內存未能被程序釋放,叫內存泄露(memory leak)。閉包
Q: 什麼狀況下出現內存泄漏?函數
首先了解一下【垃圾回收】:垃圾回收(英語:Garbage Collection,縮寫爲GC)在計算器科學中是一種自動的存儲器管理機制。當一個計算機上的動態存儲器再也不須要時,就應該予以釋放,以讓出存儲器,這種存儲器資源管理,稱爲垃圾回收。this
A: 當一塊內存再也不用到,可是垃圾回收機制又沒法釋放這塊內存的時候,就致使內存泄漏。spa
===========================================================================對象
出現內存泄露的的幾種常見狀況:事件
1、全局變量ip
由全局變量在程序終止前不會被垃圾回收,而JavaScript對未聲明變量的處理方式是在全局對象上建立該變量的引用。瀏覽器中,全局即window對象,在關閉窗口或刷新前不會釋放。內存
全局變量的狀況:資源
一、未聲明變量: a = 1
二、直接調用內含this的構建函數,this會指向window,而this擴展的屬性與方法,會綁定到window上
2、閉包也會形成內存泄漏 (先了解下【閉包】:一個函數與它的做用域鏈構成閉包。)
閉包內的函數內部調用了做用域鏈中的變量,會新分配內存來存儲這些變量,特別是柯里化最容易形成這種問題。
3、setinterval
4、事件監聽(EventListener):GC不會對事件監聽主動回收,換句話說須要開發者主動處理移除
===============
PS: js回收機制分爲兩種:「標記清除」&「引用計數」,主流新生代瀏覽器都是「標記清除」法,只有老款IE(ie8及如下)用的是「引用計數」法,由於「引用計數法」在變量循環調用時會形成內存泄漏,基本被後續瀏覽器拋棄。