中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript垃圾回收機制的理解

發布時間:2021-09-14 09:54:47 來源:億速云 閱讀:136 作者:chen 欄目:開發技術

本篇內容主要講解“JavaScript垃圾回收機制的理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JavaScript垃圾回收機制的理解”吧!

JavaScript語言是一門優秀的腳本語言。其中包含腳本語言的靈活性外還擁有許多高級語言的特性。例如充許構建和實例化一個對象,垃圾回收機制(GC:Garbage Collecation)。通常我們使用new創建對象,GC負責回收對象占用內存區域。因此了解GC,可以加深對javascript垃圾回收機制的理解。

GC在回收內存時,首先會判斷該對象是否被其它對象引用。在確定沒有其它對象引用便釋放該對象內存區域。因此如何確定對象不再被引用是GC的關鍵所在。

<script type="text/javascript">function aa()
{this.rr = "彈窗";    
}function bb()
{this.rr = "彈窗";
}var b1;function cc()
{var a1 = new aa();
    b1 = new bb();return b1;
}

cc();
alert(b1.rr)</script>

如上代碼中,執行完cc()后a1被回收了,此后我們可以通過b1.rr彈出文字窗口。在一些基礎書籍中解釋為:a1為局部變量,b1是全局變量。局部變量執行完后會被GC回收.但不全是這樣,如下代碼:

<script type="text/javascript">function aa()
{this.rr = "彈窗";    
}function bb()
{this.rr = "彈窗";
}function cc()
{var a1 = new aa();var b1 = new bb();return b1;
}var b1 = cc();
alert(b1.rr);</script>

此時cc函數中的 a1,b1都是局部變量,但仍然會彈出文字窗口。說明b1并沒有被GC回收。因此javascript中局部變量不是所有時候都被GC回收的。

GC回收機制還需要近一步了解。在此時引入幾個概念:雙向鏈表,作用域鏈,活動對象(為了方便理解,簡化了原文的概念[http://softbbs。pconline。com。cn/9497825。html]) , 其中雙向鏈表描述復雜對象的上下層級關系。 作用域鏈與活動對象分別是雙向鏈表中的某個節點。以函數cc為例變量層級關系為:

window<=>cc<=>a1<=>rr<=>b1<=>rr

在執行cc()方法時,內存中變量的引用關系如上圖,文字解釋如下:

  1. cc的活動對象包括a1和b1,其作用域鏈是window

  2. cc的活動對象包括a1和b1,其作用域鏈是window

  3. a1的活動對象包括rr,其作用域鏈是cc

  4. b1的活動對象包括rr,其作用域鏈是cc

執行cc()時,cc的執行環境會創建一個活動對象和一個作用域鏈。其局部變量a1,b1都會掛在cc的活動對象中。當cc()執行完畢后,執行環境會嘗試回收活動對象占用的內存。但因局部變量b1 通過return b1,為其增加了一條作用域鏈:window<=>b1<=>rr,所以GC停止對b1回收。因此如果想將一個局部變量/函數提升為全局的,為其增加一條作用域鏈就OK了。

同時控制好對象的作用域鏈也變得重要了。因作用域鏈會意外導致GC無法回收目標對象。例如:

<SCRIPT LANGUAGE="JavaScript"><!--//貓function cat(name)
{var zhuren ;this.name = name;        //設置主人    this.addZhuRen = function(zr){
        zhuren = zr;
    }this.getZhuRen = function(){return zhuren;
    }
}    
//主人function zhuren(name){this.name = name;
}//創建主人:var zr = new zhuren("zhangsan");//創建貓var cat1 = new cat("asan");//設置該貓的主人cat1.addZhuRen(zr);//釋放主人zr = null ;//此處還存在對主人對象的引用alert(cat1.getZhuRen().name)//--></SCRIPT>

到此,相信大家對“JavaScript垃圾回收機制的理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

精河县| 河曲县| 贵德县| 宁远县| 喀喇| 马关县| 建宁县| 陇西县| 四川省| 平潭县| 讷河市| 酒泉市| 沧州市| 炎陵县| 永川市| 台安县| 合江县| 香格里拉县| 宣武区| 德兴市| 遂川县| 双牌县| 汝南县| 拉萨市| 贵港市| 冕宁县| 隆回县| 恩施市| 新巴尔虎左旗| 察雅县| 古丈县| 团风县| 璧山县| 怀宁县| 林口县| 卓尼县| 祁阳县| 赤峰市| 汶川县| 辽宁省| 筠连县|