亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

理解并解決IE的內存泄漏方式

2019-11-18 11:35:27
字體:
來源:轉載
供稿:網友
   本文將講書述losures引起的IE內存泄漏,在本文中Closures翻譯成閉包或閉包函數。最近在網上看到一個對Closures的解釋,它是這么說的:

<Html>
<HEAD>
<script language="javascript">
function initpage()
{
  window.setTimeout("window.location.reload()", 500, "Javascript");
}
</script>
</HEAD>
<body onload="initpage()" >
<div class='menu' id='menu'></div>
<script language='javascript'>
hookup(document.getElementById('menu'));
function hookup(element)
{
  element.attachEvent( "onmouSEOver", mouse);
  function mouse ()
  {}
}
</script>
</body>
</HTML>
In this code, the handler (the mouse function) is nested inside the attacher (the hookup function). This arrangement means that the handler is closed over the scope of the caller (this arrangement is named a "closure").

閉包函數(Closures)

   由于閉包函數會使程序員在不知不覺中創建出循環引用,所以它對資源泄漏經常有著不可推卸的責任。而在閉包函數自己被釋放前,我們很難判定父函數的參數以及它的局部變量是否能被釋放。實際上閉包函數的使用已經很普通,以致人們頻繁的碰到這類問題時我們卻束手無策。在具體了解了閉包背后的問題和一些非凡的閉包泄漏示例后,我們將結合循環引用的圖示找到閉包的所在,并找出這些不受歡迎的引用來至何處。

理解并解決IE的內存泄漏方式
Figure 1. 閉包函數引起的循環引用
   普通的循環引用,是兩個不可探知的對象相互引用造成的,但是閉包卻不同。代替直接造成引用,閉包函數則取而代之從其父函數作用域中引入信息。通常,函數的局部變量和參數只能在該被調函數自身的生命周期里使用。當存在閉包函數后,這些變量和參數的引用會和閉包函數一起存在,但由于閉包函數可以超越其父函數的生命周期而存在,所以父函數中的局部變量和參數也仍然能被訪問。在下面的示例中,參數1將在函數調用終止時正常被釋放。當我們加入了一個閉包函數后,一個額外的引用產生,并且這個引用在閉包函數釋放前都不會被釋放。假如你碰巧將閉包函數放入了事件之中,那么你不得不手動從那個事件中將其移出。假如你把閉包函數作為了一個eXPando屬性,那么你也需要通過置null將其清除。

   同時閉包會在每次調用中創建,也就是說當你調用包含閉包的函數兩次,你將得到兩個獨立的閉包,而且每個閉包都分別擁有對參數的引用。由于這些顯而易見的因素,閉包確實非常用以帶來泄漏。下面的示例將展示使用閉包的主要泄漏因素:

<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"));
}

function BreakLeak()
{}
</script>
</head>
<body onload="SetupLeak()" onunload="BreakLeak()">
<div id="LeakedDiv"></div>
</body>
</html>

   假如你對怎么避免這類泄漏感到迷惑,我將告訴你處理它并不像處理普通循環引用那么簡單。"閉包"被看作函數作用域中的一個臨時對象。一旦函數執行退出,你將失去對閉包本身的引用,那么你將怎樣去調用detachEvent方法來清除引用呢?在Scott Isaacs的MSN Spaces上有一種解決這個問題的有趣方法。這個方法使用一個額外的引用(原文叫second closure,可是這個示例里致始致終只有一個closure)協助window對象執行onUnload事件,由于這個額外的引用和閉包的引用存在于同一個對象域中,于是我們可以借助它來釋放事件引用,從而完成引用移除。為了簡單起見我們將閉包的引用暫存在一個expando屬性中,下面的示例將向你演示釋放事件引用和清除expando屬性。

<html>
<head>
<script language="JScript">

function AttachEvents(element)
{
  // In order to remove this we need to put
  // it somewhere. Creates another ref
  element.expandoClick = ClickEventHandler;

  // This structure causes element to ref ClickEventHandler
  element.attachEvent("onclick", element.expandoClick);

  function ClickEventHandler()
  {
   // This closure refs element
  }
}

function SetupLeak()
{
  // The leak happens all at once
  AttachEvents(document.getElementById("LeakedDiv"));
}

function BreakLeak()
{
  document.getElementById("LeakedDiv").detachEvent("onclick",
  document.getElementById("LeakedDiv").expandoClick);
  document.getElementById("LeakedDiv").expandoClick = null;
}
</script>
</head>
<body onload="SetupLeak()" onunload="BreakLeak()">
<div id="LeakedDiv"></div>
</body>
</html>

   在這篇文章中,實際上建議我們除非迫不得已盡量不要創建使用閉包。文章中的示例,給我們演示了非閉包的事件引用方式,即把閉包函數放到頁面的全局作用域中。當閉包函數成為普通函數后,它將不再繼續其父函數的參數和局部變量,所以我們也就不用擔心基于閉包的循環引用了。在非必要的時候不使用閉包這樣的編程方式可以盡量使我們的代碼避免這樣的問題。

   最后,腳本引擎開發組的Eric Lippert,給我們帶來了一篇關于閉包使用通俗易懂的好文章。他的最終建議也是希望在真正必要的時候才使用閉包函數。雖然他的文章沒有提及閉包會使用的真正場景,但是這兒已有的大量示例非常有助于大家起步。

   不得不說Eric Lippert同志疾呼的:Don't use closures unless you really need closure semantics. In most cases, non-nested functions are the right way to go. 是非常消極的應付之辭。今天關于IE內存泄漏的文章已有很多,而且很大部分就是微軟的自己人在解釋,甚至象Eric Lippert這樣引擎開發組的成員。但是他們的文章始終沒有正面承認其實這就是IE的bug,而且是非常嚴重的bug,這事情其實完全不關腳本引擎對象和DOM對象的事。就是微軟對產品不負責任的表現,不說IE4,1997那個春天那是太遙遠了點,但是IE6也是2001年隨xp發布的。使用COM可以給他們的開發帶來很多便利,當然也利用很多現成的東西,可是居然在帶來這樣的嚴重問題后,他們卻把大部分責任歸咎于不合理和不正確的使用Closures技術!對于循環引用產生Memory Leak我根本就是不好意思提了,那樣的問題是應該發生的嗎?那就讓我們拭目以待看IE7怎么解決這堆shit問題吧,當然我希望不要再看到類似:Do not use closures unless they are necessary. 這樣的扯淡建議!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品啪在线观看麻豆免费| 国产97在线观看| 欧美性猛交xxxx免费看漫画| 国产成人精品优优av| 欧美性猛交视频| 亚洲一区二区中文| 欧美激情久久久久| 国产精品福利无圣光在线一区| 久久免费视频这里只有精品| 日韩精品在线免费观看| 欧美精品一本久久男人的天堂| 国产精品视频大全| 欧美激情精品久久久久久大尺度| 久久91精品国产91久久久| 久久精品成人欧美大片古装| 国产一区二区三区直播精品电影| 国产不卡在线观看| 亚洲午夜av电影| 亚洲摸下面视频| 亚洲国产又黄又爽女人高潮的| 国产精品18久久久久久首页狼| 色哟哟入口国产精品| 久久久国产91| 精品无人区乱码1区2区3区在线| 国产精品网站入口| 午夜精品在线观看| 亚洲18私人小影院| 国产精品久久久久久久久久| 97在线观看免费高清| 亚洲成人1234| 久久精品中文字幕免费mv| 欧美大秀在线观看| 欧美日韩亚洲高清| 亚洲性线免费观看视频成熟| 欧美精品一区二区免费| 国产成人精品久久二区二区| 国产精品福利无圣光在线一区| 色综合久久久888| 日韩精品亚洲元码| 尤物yw午夜国产精品视频明星| 色综合老司机第九色激情| 久久99精品视频一区97| 国产精品久久久久秋霞鲁丝| 亚洲美女在线观看| 久久香蕉频线观| 亚洲国产一区二区三区在线观看| 亚洲色图在线观看| 国产成人精品综合久久久| 久久人人爽人人爽人人片av高请| 亚洲乱码国产乱码精品精天堂| 国产亚洲人成网站在线观看| 欧美激情精品久久久久久免费印度| 91av在线免费观看视频| 精品久久久久久亚洲国产300| 久99九色视频在线观看| 国产丝袜高跟一区| 日韩欧美一区二区在线| 亚洲第一av网| 欧美疯狂做受xxxx高潮| 日韩av一卡二卡| 欧美精品videofree1080p| 91免费版网站入口| 欧美性资源免费| 亚洲深夜福利视频| 欧美成人激情视频| 日韩欧美视频一区二区三区| 欧美性xxxxxxx| 国产69久久精品成人| 亚洲一品av免费观看| 欧美精品videosex牲欧美| 国产精品网红福利| 尤物精品国产第一福利三区| 欧美高清在线观看| 亚洲精品电影久久久| 亚洲福利影片在线| 精品美女久久久久久免费| 国产精品久久久久久影视| 国产97在线|亚洲| 91视频免费网站| 国产91亚洲精品| 国产精品久久999| 国内免费精品永久在线视频| 日韩电影大全免费观看2023年上| 国产一区二区香蕉| 一个人看的www久久| 精品国产一区二区三区在线观看| 国产一区私人高清影院| 亚洲第一区第二区| 亚洲第一视频网| 日韩电影中文字幕| 欧美日韩国产专区| 国产精品久久久久av免费| 国产精品综合久久久| 欧美—级a级欧美特级ar全黄| 欧美日韩人人澡狠狠躁视频| 久久久免费观看视频| 国产欧美韩国高清| 精品一区二区亚洲| 亚洲欧美精品suv| 日韩免费在线观看视频| 国产suv精品一区二区三区88区| 国产精品久久久久久久久久久不卡| 欧美中文字幕在线播放| 成人伊人精品色xxxx视频| 久久亚洲精品一区二区| 亚洲男人天堂2019| 国产成人亚洲综合| 国产成人精品久久久| 国产精品美女免费| 欧美高清视频在线播放| 91久久在线视频| 日韩欧美在线免费观看| 国产又爽又黄的激情精品视频| 欧美精品久久久久久久| 日韩影视在线观看| 国产精品精品视频| 国产精品中文字幕久久久| 欧美区在线播放| 亚洲精品一区中文字幕乱码| 8090理伦午夜在线电影| 日韩精品免费在线播放| 亚洲视频第一页| 亚洲91精品在线观看| 2018日韩中文字幕| 欧美极品少妇xxxxⅹ裸体艺术| 欧美尤物巨大精品爽| 性欧美暴力猛交69hd| 国产精品99久久久久久人| 亚洲va国产va天堂va久久| 成人精品福利视频| 日韩影视在线观看| 日韩免费看的电影电视剧大全| 92裸体在线视频网站| 欧美高跟鞋交xxxxhd| 亚洲毛片在线免费观看| 欧美俄罗斯性视频| 亚洲精品综合精品自拍| 国产91色在线免费| 久久精品色欧美aⅴ一区二区| 亚洲欧美另类国产| 不卡av在线播放| 国产精品最新在线观看| 欧美日韩国产一区中文午夜| 91在线免费观看网站| 国产精品自产拍高潮在线观看| 国产成一区二区| 国产精品日韩一区| 日韩精品免费在线视频观看| 久久免费观看视频| 欧美久久久精品| 久久精品电影一区二区| 久久99精品久久久久久噜噜| 国产精品嫩草视频| 欧美国产日韩一区二区在线观看| 成人h视频在线| 亚洲新中文字幕| 国自在线精品视频| 亚洲国产另类久久精品| 国内外成人免费激情在线视频网站| 色偷偷偷亚洲综合网另类| 亚洲精品自产拍| 91在线高清视频| 日韩中文理论片| 亚洲欧美中文日韩在线v日本|