最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js內(nèi)存泄露的幾種情況詳細(xì)探討

 更新時(shí)間:2013年05月31日 17:43:52   投稿:whsnow  
內(nèi)存泄露是指一塊被分配的內(nèi)存既不能使用,又不能回收,直到瀏覽器進(jìn)程結(jié)束,由于瀏覽器垃圾回收方法有bug,會(huì)產(chǎn)生內(nèi)存泄露,下面與大家詳細(xì)探討下內(nèi)存泄露的幾種情況

內(nèi)存泄露是指一塊被分配的內(nèi)存既不能使用,又不能回收,直到瀏覽器進(jìn)程結(jié)束。在C++中,因?yàn)槭鞘謩?dòng)管理內(nèi)存,內(nèi)存泄露是經(jīng)常出現(xiàn)的事情。而現(xiàn)在流行的C#和Java等語(yǔ)言采用了自動(dòng)垃圾回收方法管理內(nèi)存,正常使用的情況下幾乎不會(huì)發(fā)生內(nèi)存泄露。瀏覽器中也是采用自動(dòng)垃圾回收方法管理內(nèi)存,但由于瀏覽器垃圾回收方法有bug,會(huì)產(chǎn)生內(nèi)存泄露。

1、當(dāng)頁(yè)面中元素被移除或替換時(shí),若元素綁定的事件仍沒被移除,在IE中不會(huì)作出恰當(dāng)處理,此時(shí)要先手工移除事件,不然會(huì)存在內(nèi)存泄露。

復(fù)制代碼 代碼如下:

<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>

應(yīng)改成下面
復(fù)制代碼 代碼如下:

<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
btn.onclick = null;
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>

或者采用事件
復(fù)制代碼 代碼如下:

<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
document.onclick = function(event){
event = event || window.event;
if(event.target.id == "myBtn"){
document.getElementById("myDiv").innerHTML = "Processing...";
}
}
</script>

2、
復(fù)制代碼 代碼如下:

var a=document.getElementById("#xx");
var b=document.getElementById("#xxx");
a.r=b;
b.r=a;

復(fù)制代碼 代碼如下:

var a=document.getElementById("#xx");
a.r=a;

對(duì)于純粹的 ECMAScript 對(duì)象而言,只要沒有其他對(duì)象引用對(duì)象 a、b,也就是說(shuō)它們只是相互之間的引用,那么仍然會(huì)被垃圾收集系統(tǒng)識(shí)別并處理。但是,在 Internet Explorer 中,如果循環(huán)引用中的任何對(duì)象是 DOM 節(jié)點(diǎn)或者 ActiveX 對(duì)象,垃圾收集系統(tǒng)則不會(huì)發(fā)現(xiàn)它們之間的循環(huán)關(guān)系與系統(tǒng)中的其他對(duì)象是隔離的并釋放它們。最終它們將被保留在內(nèi)存中,直到瀏覽器關(guān)閉。
3、
復(fù)制代碼 代碼如下:

var elem = document.getElementById('test');
elem.addEventListener('click', function() {
alert('You clicked ' + elem.tagName);
});

這段代碼把一個(gè)匿名函數(shù)注冊(cè)為一個(gè)DOM結(jié)點(diǎn)的click事件處理函數(shù),函數(shù)內(nèi)引用了一個(gè)DOM對(duì)象elem,就形成了閉包。這就會(huì)產(chǎn)生一個(gè)循環(huán)引用,即:DOM->閉包->DOM->閉包...DOM對(duì)象在閉包釋放之前不會(huì)被釋放;而閉包作為DOM對(duì)象的事件處理函數(shù)存在,所以在DOM對(duì)象釋放前閉包不會(huì)釋放,即使DOM對(duì)象在DOM tree中刪除,由于這個(gè)循環(huán)引用的存在,DOM對(duì)象和閉包都不會(huì)被釋放。可以用下面的方法可以避免這種內(nèi)存泄露
復(fù)制代碼 代碼如下:

var elem = document.getElementById('test');
elem.addEventListener('click', function() {
alert('You clicked ' + this.tagName); // 不再直接引用elem變量
});

4、
復(fù)制代碼 代碼如下:

function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
}

閉包非常容易構(gòu)成循環(huán)引用。如果一個(gè)構(gòu)成閉包的函數(shù)對(duì)象被指定給,比如一個(gè) DOM 節(jié)點(diǎn)的事件處理器,而對(duì)該節(jié)點(diǎn)的引用又被指定給函數(shù)對(duì)象作用域中的一個(gè)活動(dòng)(或可變)對(duì)象,那么就存在一個(gè)循環(huán)引用。
DOM_Node.onevent -<function_object.[[scope]] -<scope_chain -<Activation_object.nodeRef -<DOM_Node。

形成這樣一個(gè)循環(huán)引用是輕而易舉的,而且稍微瀏覽一下包含類似循環(huán)引用代碼的網(wǎng)站(通常會(huì)出現(xiàn)在網(wǎng)站的每個(gè)頁(yè)面中),就會(huì)消耗大量(甚至全部)系統(tǒng)內(nèi)存。
解決之道,將事件處理函數(shù)定義在外部,解除閉包
復(fù)制代碼 代碼如下:

function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=onclickHandler;
}
function onclickHandler(){
//do something
}

或者在定義事件處理函數(shù)的外部函數(shù)中,刪除對(duì)dom的引用(題外,《JavaScript權(quán)威指南》中介紹過(guò),閉包中,作用域中沒用的屬性可以刪除,以減少內(nèi)存消耗。)
復(fù)制代碼 代碼如下:

function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;
}

5、
復(fù)制代碼 代碼如下:

a = {p: {x: 1}};
b = a.p;
delete a.p;

執(zhí)行這段代碼之后b.x的值依然是1.由于已經(jīng)刪除的屬性引用依然存在,因此在JavaScript的某些實(shí)現(xiàn)中,可能因?yàn)檫@種不嚴(yán)謹(jǐn)?shù)拇a而造成內(nèi)存泄露。所以在銷毀對(duì)象的時(shí)候,要遍歷屬性中屬性,依次刪除。
6. 自動(dòng)類型裝箱轉(zhuǎn)換
別不相信,下面的代碼在ie系列中會(huì)導(dǎo)致內(nèi)存泄露
復(fù)制代碼 代碼如下:

var s=”lalala”;
alert(s.length);

s本身是一個(gè)string而非object,它沒有l(wèi)ength屬性,所以當(dāng)訪問(wèn)length時(shí),JS引擎會(huì)自動(dòng)創(chuàng)建一個(gè)臨時(shí)String對(duì)象封裝s,而這個(gè)對(duì)象一定會(huì)泄露。這個(gè)bug奇怪,所幸解決起來(lái)相當(dāng)容易,記得所有值類型做.運(yùn)算之前先顯式轉(zhuǎn)換一下:
復(fù)制代碼 代碼如下:

var s="lalala";
alert(new String(s).length);

7、某些DOM操作
IE系列的特有問(wèn)題 簡(jiǎn)單的來(lái)說(shuō)就是在向不在DOM樹上的DOM元素appendChild;IE7中,貌似為了改善內(nèi)存泄露,IE7采用了極端的解決方案:離開頁(yè)面時(shí)回收所有DOM樹上的元素,其它一概不管。

相關(guān)文章

  • JS實(shí)現(xiàn)網(wǎng)站吸頂條

    JS實(shí)現(xiàn)網(wǎng)站吸頂條

    這篇文章主要為大家詳細(xì)介紹了JS制作網(wǎng)站吸頂條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • TypeScript封裝一個(gè)通用的時(shí)間格式化方法

    TypeScript封裝一個(gè)通用的時(shí)間格式化方法

    在日常開發(fā)中,我們經(jīng)常需要將時(shí)間格式化為用戶友好的形式,本文將介紹如何在 TypeScript 中封裝一個(gè)通用的時(shí)間格式化方法,需要的可以了解下
    2025-02-02
  • 通過(guò)flv.js播放監(jiān)控示例深入探究直播流技術(shù)

    通過(guò)flv.js播放監(jiān)控示例深入探究直播流技術(shù)

    本文記錄一下在使用 flv.js 播放監(jiān)控視頻時(shí)踩過(guò)的各種各樣的坑,雖然官網(wǎng)給的?Getting Started?只有短短幾行代碼,跑一個(gè)能播視頻的 demo 很容易,但是播放時(shí)各種各樣的異常會(huì)搞到你懷疑人生,下面我將自己踩過(guò)的坑,以及踩坑過(guò)程中補(bǔ)充的相關(guān)知識(shí),詳細(xì)總結(jié)一下
    2023-10-10
  • 原生JS運(yùn)動(dòng)實(shí)現(xiàn)輪播圖

    原生JS運(yùn)動(dòng)實(shí)現(xiàn)輪播圖

    這篇文章主要為大家詳細(xì)介紹了原生JS運(yùn)動(dòng)實(shí)現(xiàn)輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • js實(shí)現(xiàn)消息滾動(dòng)效果

    js實(shí)現(xiàn)消息滾動(dòng)效果

    本文主要分享了js實(shí)現(xiàn)消息滾動(dòng)效果的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • 淺談js中startsWith 函數(shù)不能在任何瀏覽器兼容的問(wèn)題

    淺談js中startsWith 函數(shù)不能在任何瀏覽器兼容的問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺談js中startsWith 函數(shù)不能在任何瀏覽器兼容的問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • Javascript變量函數(shù)聲明提升深刻理解

    Javascript變量函數(shù)聲明提升深刻理解

    本文主要介紹了Javascript變量函數(shù)聲明提升深刻理解,Javascript變量函數(shù)聲明提升Hoisting是在Javascript中執(zhí)行上下文工作方式的一種認(rèn)識(shí),更多相關(guān)知識(shí)需要的小伙伴可以參考下面文章詳細(xì)內(nèi)容
    2022-06-06
  • 探索Javascript中this的奧秘

    探索Javascript中this的奧秘

    本文介紹了JavaScript中的this關(guān)鍵字在各種情況下的含義,實(shí)例都很簡(jiǎn)單,這樣更能有助于加深理解。雖然這只是js中一個(gè)很小的概念,但借此我們可以了解js中函數(shù)的執(zhí)行環(huán)境,充分掌握this的相關(guān)知識(shí)有助于我們?cè)诰帉懨嫦驅(qū)ο蟮腏avaScript程序時(shí)能夠游刃有余。
    2016-12-12
  • 使用iframe window的scroll方法控制iframe頁(yè)面滾動(dòng)

    使用iframe window的scroll方法控制iframe頁(yè)面滾動(dòng)

    在頁(yè)面中如何控制內(nèi)嵌的iframe滾動(dòng)呢?方法是使用iframe window的scroll方法,大家可以參考下面的示例
    2014-03-03
  • js實(shí)現(xiàn)對(duì)ajax請(qǐng)求面向?qū)ο蟮姆庋b

    js實(shí)現(xiàn)對(duì)ajax請(qǐng)求面向?qū)ο蟮姆庋b

    這篇文章主要介紹了js實(shí)現(xiàn)對(duì)ajax請(qǐng)求面向?qū)ο蟮姆庋b的相關(guān)資料,需要的朋友可以參考下
    2016-01-01

最新評(píng)論

自贡市| 伊金霍洛旗| 那坡县| 宁波市| 铜梁县| 正蓝旗| 温州市| 运城市| 华阴市| 达州市| 玉山县| 郸城县| 比如县| 冕宁县| 汝城县| 南丰县| 丹阳市| 堆龙德庆县| 高雄县| 长沙市| 房产| 金川县| 鲁山县| 张家川| 磴口县| 庄浪县| 桂东县| 富蕴县| 威信县| 邳州市| 云龙县| 乌拉特中旗| 大城县| 犍为县| 深泽县| 灵宝市| 富源县| 肇东市| 津市市| 嵊泗县| 新丰县|