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

首頁 > 語言 > JavaScript > 正文

詳談JavaScript內存泄漏

2024-05-06 16:10:38
字體:
來源:轉載
供稿:網友
文章從什么是閉包、以及閉包所涉及的作用域鏈說起,講述了JavaScript垃圾回收機制、循環引用、循環引用和閉包、IE中的內存泄漏以及解決方法,是篇非常詳盡,非常不錯的文章,這里推薦給大家。
 
 

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探花福利精品国产自产在线| 色青青草原桃花久久综合| 粉嫩老牛aⅴ一区二区三区| 高清欧美性猛交| 国产精品igao视频| 亚洲在线观看视频网站| 国产综合在线视频| 伦理中文字幕亚洲| 国产精品免费久久久久影院| 欧美激情亚洲另类| 一区二区三区四区在线观看视频| 日韩在线播放av| 国产精品一区二区久久国产| 亚洲美女视频网| 久久91精品国产| 亚洲国产精品国自产拍av秋霞| 欧美一区二区三区免费观看| 日韩av中文字幕在线| 福利一区视频在线观看| 伊人青青综合网站| 在线性视频日韩欧美| 亚洲精品综合久久中文字幕| 欧美精品一二区| 日韩精品免费一线在线观看| 国产一区二区三区在线看| 中日韩午夜理伦电影免费| 久久久久久久成人| 96精品久久久久中文字幕| 4p变态网欧美系列| 欧美性猛交xxxx偷拍洗澡| 欧美日韩国产在线播放| 成人美女av在线直播| xx视频.9999.com| 国产91在线视频| 91在线视频导航| 在线观看欧美日韩国产| 夜夜嗨av色一区二区不卡| 国产精品影片在线观看| 亚洲区在线播放| 久久久亚洲欧洲日产国码aⅴ| 在线亚洲国产精品网| 久久中文字幕国产| 日av在线播放中文不卡| 成人国内精品久久久久一区| 国产精品久久电影观看| 成人免费激情视频| 欧美激情精品久久久久久黑人| 奇米四色中文综合久久| 91高清免费在线观看| 亚洲毛片在线看| 国产精品成久久久久三级| 亚洲视频专区在线| 91精品国产自产91精品| 日韩免费av一区二区| 一区二区三区在线播放欧美| 精品亚洲夜色av98在线观看| 久久免费精品日本久久中文字幕| 久久精品国产精品| 久久夜色精品亚洲噜噜国产mv| 亚洲精品美女在线| www.亚洲免费视频| 78m国产成人精品视频| 国产精品亚洲综合天堂夜夜| 久久久久久91| 亚洲精品日韩在线| 好吊成人免视频| 成人免费xxxxx在线观看| 国产精品网站视频| 韩国精品久久久999| 久久久人成影片一区二区三区观看| 欧美亚洲成人精品| 欧美午夜丰满在线18影院| 国产美女扒开尿口久久久| 亚洲国产日韩精品在线| 欧美视频中文在线看| 羞羞色国产精品| 精品中文字幕视频| 亚洲男人天堂2024| 久久精品免费播放| 亚洲japanese制服美女| 欧美日韩另类在线| 国产精品成人播放| 国产成人激情小视频| 国产91免费看片| 欧美激情国产精品| 国产mv免费观看入口亚洲| 久久久久久久一区二区三区| 国产精品亚洲视频在线观看| 91精品久久久久久久久中文字幕| 一区二区欧美在线| 欧美专区国产专区| 久久久女人电视剧免费播放下载| 波霸ol色综合久久| 欧美日韩国产丝袜美女| 国产精品91久久久| 98精品国产自产在线观看| 久久中国妇女中文字幕| 久久久免费高清电视剧观看| 精品日本美女福利在线观看| 精品调教chinesegay| 17婷婷久久www| 亚洲天堂精品在线| 亚洲成人精品视频| 欧美成人精品xxx| 欧美野外猛男的大粗鳮| 亚洲天堂视频在线观看| 久久久亚洲国产天美传媒修理工| 国产视频观看一区| 91亚洲va在线va天堂va国| 亚洲天天在线日亚洲洲精| 久久色免费在线视频| 一区二区三区动漫| 福利一区视频在线观看| 国产中文字幕日韩| 成人av资源在线播放| 日韩亚洲综合在线| 日韩国产在线看| 久久精品亚洲精品| 欧美一级淫片aaaaaaa视频| 亚洲深夜福利视频| 欧美黑人国产人伦爽爽爽| 在线看片第一页欧美| 中文字幕av一区二区| 国产精品久久久久秋霞鲁丝| 91精品国产91久久久久久不卡| 人九九综合九九宗合| 国产精品一区二区三区免费视频| 国产欧美日韩高清| 日本精品性网站在线观看| 欧美视频精品一区| 日韩免费精品视频| 亚洲最大在线视频| 国产精品91视频| 亚洲娇小xxxx欧美娇小| 国产一区二区香蕉| 播播国产欧美激情| 亚洲a级在线观看| 亚洲成人久久网| 日本中文字幕不卡免费| 欧美激情亚洲视频| www.国产一区| 91精品国产91久久久久久最新| 日韩av免费在线播放| 日韩中文字幕国产| 91精品国产色综合久久不卡98口| 日本久久久久久久| 成人a在线视频| 97超碰蝌蚪网人人做人人爽| 538国产精品一区二区在线| 亚洲日本欧美日韩高观看| 黑人狂躁日本妞一区二区三区| 色偷偷av一区二区三区乱| 丝袜美腿亚洲一区二区| 欧美日韩人人澡狠狠躁视频| 欧美激情中文网| 日韩av免费在线播放| 91精品中国老女人| 精品视频在线播放色网色视频|