二、閉包(Closures)
仍然先看一段代碼:
< html > < head > < script language = “ JScript “ > function AttachEvents(element) { // This structure causes element to ref ClickEventHandler element.attachEvent( “ onclick “ , ClickEventHandler); function ClickEventHandler() { // This closure refs element } } function SetupLeak() { // The leak happens all at once AttachEvents(document.getElementById( “ LeakedDiv “ )); } </ script > </ head > < body onload = “ SetupLeak() “ > < div id = “ LeakedDiv “ ></ div > </ body > </ html >
閉包的一個內(nèi)部方法賦給了element對象,產(chǎn)生了一個作用域的循環(huán)引用,從而造成內(nèi)存泄露。其原理圖如下:
解決方案如下,在確定事件不再使用后,解除事件的綁定:
function BreakLeak() { document.getElementById(”LeakedDiv”).detachEvent(”onclick”, document.getElementById(”LeakedDiv”).expandoClick); document.getElementById(”LeakedDiv”).expandoClick = null; }
通常情況下,常用的js框架都幫我們解決了這個問題,不需要我們自己處理,這也是使用框架的一個好處。
出處:alibaba.com中國站
責(zé)任編輯:bluehearts
上一頁 GC與JS內(nèi)存泄露 [3] 下一頁 GC與JS內(nèi)存泄露 [5]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|