JacaScript 閉包(四)內(nèi)存泄漏

由于IE9之前的版本對(duì)JScript對(duì)象和COM對(duì)象使用不同的垃圾收集例程挥唠,因此閉包在IE這些版本中會(huì)導(dǎo)致一些特殊的問題日杈。具體來說点待,如果閉包的作用域鏈中保存著一個(gè)HTML元素搔耕,那么就意味著該元素將無法被銷毀矮嫉。

function assignHandler() {
var element = document.getElementById("someElement");

element.onClick = function() {
alert(element.id);
}
}

上例代碼創(chuàng)建了一個(gè) element 元素時(shí)間處理程序的閉包,而這個(gè)閉包則又創(chuàng)建了一個(gè)循環(huán)引用蚪拦。由于匿名函數(shù)保存了一個(gè)對(duì) assignHandler() 的活動(dòng)對(duì)象的引用杖剪,因此就會(huì)導(dǎo)致無法減少 element 的引用次數(shù)。只要匿名函數(shù)存在驰贷, element 的引用數(shù)至少也是1盛嘿,因此它所占用的內(nèi)存永遠(yuǎn)不會(huì)被回收。不過括袒,這個(gè)問題可以通過稍微改寫一些代碼來解決次兆。

function assignHandler() {
var element = document.getElementById("someElement");
var id = element.id;

element.onClick = function() {
alert(id);
}

element = null
}

在上面的代碼中,通過把 element.id 的一個(gè)副本保存在一個(gè)變量中锹锰,并且在閉包中引用該變量消除了循環(huán)引用芥炭。但僅僅做到這一步,還是不能解決內(nèi)存泄漏問題恃慧。

閉包會(huì)引用函數(shù)的整個(gè)活動(dòng)對(duì)象园蝠,而其中包含著 element 。即使閉包不直接引用 element痢士,包含函數(shù)的活動(dòng)對(duì)象中也仍然會(huì)保存一個(gè)引用彪薛。

把 element 變量設(shè)置為 null,這樣就能夠解除對(duì)DOM對(duì)象的引用良瞧,村里的減少其引用次數(shù)陪汽,確保正常回收其占用的內(nèi)存褥蚯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市况增,隨后出現(xiàn)的幾起案子赞庶,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歧强,死亡現(xiàn)場(chǎng)離奇詭異澜薄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)摊册,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門肤京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茅特,你說我怎么就攤上這事忘分。” “怎么了白修?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵妒峦,是天一觀的道長。 經(jīng)常有香客問我兵睛,道長肯骇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任祖很,我火速辦了婚禮笛丙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘假颇。我一直安慰自己若债,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布拆融。 她就那樣靜靜地躺著蠢琳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镜豹。 梳的紋絲不亂的頭發(fā)上傲须,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音趟脂,去河邊找鬼泰讽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昔期,可吹牛的內(nèi)容都是我干的已卸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼硼一,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼累澡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起般贼,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤愧哟,失蹤者是張志新(化名)和其女友劉穎奥吩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕊梧,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霞赫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肥矢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片端衰。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甘改,靈堂內(nèi)的尸體忽然破棺而出旅东,到底是詐尸還是另有隱情,我是刑警寧澤楼誓,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布玉锌,位于F島的核電站,受9級(jí)特大地震影響疟羹,放射性物質(zhì)發(fā)生泄漏主守。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一榄融、第九天 我趴在偏房一處隱蔽的房頂上張望参淫。 院中可真熱鬧,春花似錦愧杯、人聲如沸涎才。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耍铜。三九已至,卻和暖如春跌前,著一層夾襖步出監(jiān)牢的瞬間棕兼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工抵乓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伴挚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓灾炭,卻偏偏與公主長得像茎芋,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜈出,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 定義函數(shù)的方式有兩種:函數(shù)聲明和函數(shù)表達(dá)式田弥。 函數(shù)聲明的一個(gè)重要特征就是函數(shù)聲明提升,意思是在執(zhí)行代碼前會(huì)先讀取函...
    oWSQo閱讀 661評(píng)論 0 0
  • 我很愛和女兒一起看 TED 演講掏缎。我們總在睡前看一段皱蹦,次日上學(xué)路上再對(duì)所看內(nèi)容進(jìn)行交流煤杀。我知道在看 TED眷蜈、聊 T...
    ElfeXu閱讀 1,182評(píng)論 0 0
  • 十四行記錄日常沪哺,記錄我平淡一天中些許的bright point.Here is for today. 你知道我抽煙...
    sH2nxy閱讀 329評(píng)論 0 1
  • 回到家以后覺得很累,晚飯也沒吃躺在床上就想睡覺酌儒。后來辜妓,還是給好友發(fā)了微信,發(fā)發(fā)牢騷忌怎,告訴她一些近況籍滴。她沒回,我也就...
    拉卡羅拉閱讀 366評(píng)論 0 0
  • 謝謝你在人海中 導(dǎo)語:趁陽光正好榴啸,趁微風(fēng)不噪孽惰,去擁抱你愛的人吧。 那片笑聲讓我想起我的那些花兒鸥印,在我生命每個(gè)角落...
    榕樹下的星星閱讀 617評(píng)論 2 1