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

首頁 > 編程 > JavaScript > 正文

詳談JavaScript內存泄漏

2019-11-20 13:55:41
字體:
來源:轉載
供稿:網友

1、什么是閉包、以及閉包所涉及的作用域鏈這里就不說了。

2、JavaScript垃圾回收機制

     JavaScript不需要手動地釋放內存,它使用一種自動垃圾回收機制(garbage collection)。當一個對象無用的時候,即程序中無變量引用這個對象時,就會從內存中釋放掉這個變量。

復制代碼 代碼如下:

    var s = [ 1, 2 ,3];
    var s = null;
    //這樣原始的數組[1 ,2 ,3]就會被釋放掉了。

3、循環引用

     三個對象 A 、B 、C

     AàBàC :A的某一屬性引用著B,同樣C也被B的屬性引用著。如果將A清除,那么B、C也被釋放。

     AàBàCàB :這里增加了C的某一屬性引用B對象,如果這是清除A,那么B、C不會被釋放,因為B和C之間產生了循環引用。

復制代碼 代碼如下:

    var a = {};
    a.pro = { a:100 };
    a.pro.pro = { b:100 };
    a = null ;
    //這種情況下,{a:100}和{b:100}就同時也被釋放了。
           
    var obj = {};
    obj.pro = { a : 100 };
    obj.pro.pro = { b : 200 };
    var two = obj.pro.pro;
    obj = null;   
    //這種情況下 {b:200}不會被釋放掉,而{a:100}被釋放了。
 

4、循環引用和閉包

復制代碼 代碼如下:

    function outer(){
        var obj = {};
        function inner(){
            //這里引用了obj對象
        }
        obj.inner = inner;
    }

這是一種及其隱蔽的循環引用,。當調用一次outer時,就會在其內部創建obj和inner兩個對象,obj的inner屬性引用了inner;同樣inner也引用了obj,這是因為obj仍然在innerFun的封閉環境中,準確的講這是由于JavaScript特有的“作用域鏈”。
因此,閉包非常容易創建循環引用,幸運的是JavaScript能夠很好的處理這種循環引用。

5、IE中的內存泄漏

    IE中的內存泄漏有好幾種,這里有詳細的解釋(http://msdn.microsoft.com/en-us/library/bb250448.aspx)。

    這里只討論其中一種,即循環引用所造成的內存泄漏,因為,這是一種最普遍的情況。

    當在DOM元素或一個ActiveX對象與普通JavaScript對象之間存在循環引用時,IE在釋放這類變量時存在特殊的困難,最好手動切斷循環引用,這個bug在IE 7中已經被修復了(http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)。

   “IE 6 suffered from memory leaks when a circular reference between several objects, among which at least one DOM node, was created. This problem has been solved in IE 7. ”

    如果上面的例子(第4點)中obj引用的不是一個JavaScript Function對象(inner),而是一個ActiveX對象或Dom元素,這樣在IE中所形成的循環引用無法得到釋放。

復制代碼 代碼如下:

    function init(){
        var elem = document.getElementByid( 'id' );
        elem.onclick = function(){
            alert('rain-man');
            //這里引用了elem元素
        };
    }

Elem引用了它的click事件的監聽函數,同樣該函數通過其作用域鏈也引用回了elem元素。這樣在IE中即使離開當前頁面也不會釋放這些循環引用。

6、解決方法

   基本的方法就是手動清除這種循環引用,下面一個十分簡單的例子,實際應用時可以自己構建一個addEvent()函數,并且在window的unload事件上對所有事件綁定進行清除。

復制代碼 代碼如下:

    function outer(){
        var one = document.getElementById( 'one' );
        one.onclick = function(){};
    }
    window.onunload = function(){
        var one = document.getElementById( 'one' );
        one.onclick = null;
    };

 其它方法(by:Douglas Crockford)

復制代碼 代碼如下:

/**
 * 遍歷某一元素節點及其所有后代元素
 *
 * @param Elem node  所要清除的元素節點
 * @param function func  進行處理的函數
 *
 */
function walkTheDOM(node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
        walkTheDOM(node, func);
        node = node.nextSibling;
    }
}
/**
 * 清除dom節點的所有引用,防止內存泄露
 *
 * @param Elem node  所要清除的元素節點
 *
 */
function purgeEventHandlers(node) {
    walkTheDOM(node, function (e) {
        for (var n in e) {           
            if (typeof e[n] ===
                    'function') {
                e[n] = null;
            }
        }
    });

以上就是JavaScript內存泄漏的相關內容以及解決方案了,有需要的小伙伴可以參考下

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产一区二区三区| 久久久久亚洲精品成人网小说| 久久国产精品久久久久久久久久| 久久国产精品久久久久久| 欧美俄罗斯乱妇| 国产91精品在线播放| 精品中文字幕乱| 92版电视剧仙鹤神针在线观看| 国产精品一区二区久久精品| 亚洲成人激情视频| 午夜精品一区二区三区在线视| 亚洲va欧美va国产综合剧情| 日韩欧美在线国产| 成人精品在线视频| 亚洲成色999久久网站| 国产欧美婷婷中文| 国产亚洲成av人片在线观看桃| 国产欧美中文字幕| 久久这里有精品| 国产精品高精视频免费| 亚洲丝袜在线视频| 亚洲精品久久久久中文字幕二区| 欧美日韩激情小视频| 亚洲国产日韩欧美综合久久| 成人动漫网站在线观看| 日韩国产高清视频在线| 久久精品电影一区二区| 96精品视频在线| 国产精品久久久久久久9999| 国产在线精品一区免费香蕉| 98视频在线噜噜噜国产| 国产精品www| 4k岛国日韩精品**专区| 97超级碰在线看视频免费在线看| 久久久久久成人| 亚洲第一综合天堂另类专| 91九色蝌蚪国产| 久久久久久亚洲精品中文字幕| 国产在线观看精品一区二区三区| 精品久久久久久中文字幕一区奶水| 亚洲精品色婷婷福利天堂| 97国产精品人人爽人人做| 欧美激情videoshd| 久久电影一区二区| www.欧美三级电影.com| 91精品在线影院| 亚洲国产精品嫩草影院久久| 97在线免费观看视频| 国产精品永久免费在线| 97在线精品国自产拍中文| 欧美日本高清一区| 亚洲国产精品999| 国产精品美女视频网站| 国产精品白丝jk喷水视频一区| 91丨九色丨国产在线| 一本一本久久a久久精品综合小说| 日本19禁啪啪免费观看www| 欧美成人精品h版在线观看| 欧美日韩精品在线视频| 色妞在线综合亚洲欧美| 精品视频www| 国产精品视频色| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲最大成人在线| 亚洲无限乱码一二三四麻| 国产精品h片在线播放| 国产精品美女免费| 丝袜美腿亚洲一区二区| 日韩女优人人人人射在线视频| 亚洲国产精品久久精品怡红院| 国产欧美日韩精品丝袜高跟鞋| 俺去亚洲欧洲欧美日韩| 欧美激情一区二区三区高清视频| 欧美成人免费全部观看天天性色| 日韩麻豆第一页| 亚洲夜晚福利在线观看| 欧美午夜激情小视频| 日本高清不卡在线| 亚洲美女动态图120秒| 亚洲一二在线观看| 亚洲欧美综合区自拍另类| 国产日韩欧美电影在线观看| 国产日韩欧美综合| 国产日韩欧美在线观看| 亚洲日本中文字幕| 国内偷自视频区视频综合| 日韩精品在线视频观看| 国产日韩av高清| 欧美亚洲在线播放| 性色av一区二区三区免费| 成人午夜黄色影院| 久久精品成人一区二区三区| 久热爱精品视频线路一| 亚洲精品电影在线观看| 国产精品久久久久久久久久久久久| 国内外成人免费激情在线视频网站| 日韩中文字幕视频| 国产91在线播放| 亚洲专区中文字幕| 国产欧美精品在线| 亚洲开心激情网| 亚洲综合第一页| 国内精品小视频在线观看| 亚洲第一精品久久忘忧草社区| 九九热最新视频//这里只有精品| 92看片淫黄大片看国产片| 亚洲毛片一区二区| 欧美福利在线观看| 久久久最新网址| 高清在线视频日韩欧美| 91久久久久久久久久| 久久天天躁狠狠躁老女人| 综合国产在线观看| 高清日韩电视剧大全免费播放在线观看| 日韩色av导航| 国自产精品手机在线观看视频| 青青青国产精品一区二区| 国产精品99一区| 日韩成人中文字幕在线观看| 久久久久久久久国产精品| 亚洲国产精久久久久久| www.日韩av.com| 亚洲最大福利视频网站| 久久久日本电影| 2020国产精品视频| 亚州av一区二区| 成人中文字幕+乱码+中文字幕| 亚洲无限av看| 欧美一级淫片aaaaaaa视频| 亚洲人在线视频| 精品久久久一区| 国产成人精品优优av| 国产综合色香蕉精品| 亚洲精品中文字幕有码专区| 久久天天躁狠狠躁老女人| 久久精品久久久久| 国产精品免费视频久久久| 欧美日韩视频免费播放| 国产欧美一区二区三区视频| 久久久国产一区| 亚洲图片欧美午夜| 日韩在线高清视频| 久久国产一区二区三区| 欧美二区在线播放| 欧美最猛黑人xxxx黑人猛叫黄| 日韩精品999| 日韩精品在线免费观看视频| 91美女福利视频高清| 国产精品视频公开费视频| 日韩天堂在线视频| 精品无人国产偷自产在线| 91精品国产乱码久久久久久蜜臀| 亚洲一二在线观看| 亚洲精品日韩激情在线电影| 日韩亚洲精品电影| 欧美放荡办公室videos4k| 久久久久久久久久av| 国产成人精品在线视频| 2023亚洲男人天堂| 日韩精品视频免费在线观看| 日韩av电影手机在线| 久久成人在线视频| 欧美激情视频网站| 成人国产亚洲精品a区天堂华泰|