您好,登錄后才能下訂單哦!
本篇內容主要講解“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()方法時,內存中變量的引用關系如上圖,文字解釋如下:
cc的活動對象包括a1和b1,其作用域鏈是window
cc的活動對象包括a1和b1,其作用域鏈是window
a1的活動對象包括rr,其作用域鏈是cc
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垃圾回收機制的理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。