您好,登錄后才能下訂單哦!
本篇文章為大家展示了JavaScript中內存回收機制的原理是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
JavaScript語言是一門優秀的腳本語言.其中包含腳本語言的靈活性外還擁有許多高級語言的特性.例如充許構建和實例化一個對象,垃圾回收機制(GC:Garbage Collecation).通常我們使用new創建對象,GC負責回收對象占用內存區域.因此了解GC,可以加深對JavaScript垃圾回收機制的理解。
1.用局部變量和全局變量解釋GC
GC在回收內存時,首先會判斷該對象是否被其它對象引用.在確定沒有其它對象引用便釋放該對象內存區域.因此如何確定對象不再被引用是GC的關鍵所在.
<script> 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> 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回收的.
2.抽象理解GC
GC回收機制還需要近一步了解。在此時引入幾個概念:雙向鏈表,作用域鏈,活動對象(為了方便理解,簡化了原文的概念
Javascript閉包(closure) 深入淺出 , 其中雙向鏈表描述復雜對象的上下層級關系. 作用域鏈與活動對象分別是雙向鏈表中的某個節點.以函數cc為例變量層級關系為:
window<=>cc<=>a1<=>rr <=>b1<=>rr
(原文有詳細解釋)在執行cc()方法時,內存中變量的引用關系如上圖,文字解釋如下:
window的活動對象包括cc,假設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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。