JavaScript是一門弱類型語言,使用函數(shù)作為一等公民,其特有的閉包形式使得很多高級應用得以實現(xiàn)。但是,由于閉包具有相對獨立的私有作用域,若處理不當就會導致內(nèi)存泄露的問題。
舉個例子,假設我們現(xiàn)在要清空一個div的子元素,一種直接的做法是這樣:
function clearDiv(){ var div = document.getElementById('div'); while(div.firstChild){ div.removeChild(div.firstChild); } }
這種方法看起來挺好,但是如果存在一個閉包內(nèi)引用了div,在閉包的生命周期內(nèi)會一直對div對象有引用,即使外部調(diào)用了clearDiv清空了div,這個閉包依然存在,導致div對象無法被回收。
舉個更具體的例子,如下代碼:
var div = document.getElementById('div'); document.onclick = function(){ alert(div.innerHTML); };
在這個例子中,div引用被一個閉包所包含,當用戶點擊頁面時,alert會彈出div元素的innerHTML。但是,當頁面卸載時,這個閉包依然存在,由于div對象仍被閉包引用,即使在頁面卸載時,div元素不能被釋放,就形成了內(nèi)存泄露。
那么如何解決這個問題呢?一般來說,主要采用以下幾種方式:
方法一:顯示的將引用賦為空
function clearDiv(){ var div = document.getElementById('div'); while(div.firstChild){ div.removeChild(div.firstChild); } div = null; }
方法二:在閉包函數(shù)執(zhí)行完畢后,將閉包引用的對象刪除
var div = document.getElementById('div'); document.onclick = function(){ alert(div.innerHTML); div = null; };
方法三:盡可能避免使用閉包
var div = document.getElementById('div'); div.onclick = function(){ alert(this.innerHTML); };
以上方法都能避免閉包造成的內(nèi)存泄露問題,依照個人的喜好和實際需要使用即可。
需要注意的是,在不需要使用閉包時,不要使用;在必要使用閉包時,一定要注意內(nèi)存泄露問題,及時對引用進行清理操作。這樣才能充分發(fā)揮閉包的優(yōu)勢,減少內(nèi)存泄露的風險。
上一篇div 虛線框