自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JavaScript內存回收機制深入解讀

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

JavaScript語言是一門優(yōu)秀的腳本語言.其中包含腳本語言的靈活性外還擁有許多高級語言的特性.例如充許構建和實例化一個對象,垃圾回

收機制(GC:Garbage Collecation).通常我們使用new創(chuàng)建對象,GC負責回收對象占用內存區(qū)域.因此了解GC,可以加深對JavaScript垃圾回收

機制的理解。

1.用局部變量和全局變量解釋GC

GC在回收內存時,首先會判斷該對象是否被其它對象引用.在確定沒有其它對象引用便釋放該對象內存區(qū)域.因此如何確定對象不再被引用是

GC的關鍵所在.

  1. <script>  
  2.         function aa(){  
  3.             this.rr = "彈窗";      
  4.         }  
  5.         function bb(){  
  6.         this.rr = "彈窗";  
  7.         }  
  8.  
  9.         var b1;  
  10.         function cc(){  
  11.             var a1 = new aa();  
  12.             b1 = new bb();  
  13.                     return b1;  
  14.         }  
  15.  
  16.         cc();  
  17.         alert(b1.rr)  
  18.     </script> 

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

變量執(zhí)行完后會被GC回收.但不全是這樣,如下代碼:

  1. <script>  
  2.         function aa(){  
  3.             this.rr = "彈窗";      
  4.         }  
  5.         function bb(){  
  6.             this.rr = "彈窗";  
  7.         }  
  8.  
  9.         function cc(){  
  10.             var a1 = new aa();  
  11.             var b1 = new bb();  
  12.                 return b1;  
  13.         }  
  14.  
  15.         var b1 = cc();  
  16.         alert(b1.rr);  
  17.     </script> 

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

2.抽象理解GC

GC回收機制還需要近一步了解。在此時引入幾個概念:雙向鏈表,作用域鏈,活動對象(為了方便理解,簡化了原文的概念

[http://softbbs.pconline.com.cn/9497825.html]) , 其中雙向鏈表描述復雜對象的上下層級關系. 作用域鏈與活動對象分別是雙向鏈表

中的某個節(jié)點.以函數(shù)cc為例變量層級關系為:

  1. window<=>cc<=>a1<=>rr  
  2.                         <=>b1<=>rr 

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

window的活動對象包括cc,假設window是***對象(因為運行中不會被回收)

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

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

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

執(zhí)行cc()時,cc的執(zhí)行環(huán)境會創(chuàng)建一個活動對象和一個作用域鏈.其局部變量a1,b1都會掛在cc的活動對象中.當cc()執(zhí)行完畢后,執(zhí)行環(huán)境

會嘗試回收活動對象占用的內存.但因局部變量b1 通過return b1,為其增加了一條作用域鏈:window<=>b1<=>rr,所以GC停止對b1回收.

因此如果想將一個局部變量/函數(shù)提升為全局的,為其增加一條作用域鏈就OK了。

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

  1. <SCRIPT LANGUAGE="JavaScript">  
  2.       <!--  
  3.     //貓  
  4.     function cat(name){  
  5.         var zhuren ;  
  6.         this.name = name;  
  7.           
  8.         //設置主人  
  9.         this.addZhuRen = function(zr){  
  10.             zhuren = zr;  
  11.         }  
  12.  
  13.         this.getZhuRen = function(){  
  14.             return zhuren;  
  15.         }  
  16.     }  
  17.       
  18.     //主人  
  19.     function zhuren(name){  
  20.         this.name = name;  
  21.     }  
  22.  
  23.     //創(chuàng)建主人:  
  24.     var zr = new zhuren("zhangsan");  
  25.     //創(chuàng)建貓  
  26.     var cat1 = new cat("asan");  
  27.     //設置該貓的主人  
  28.     cat1.addZhuRen(zr);  
  29.     //釋放主人  
  30.     zr = null ;  
  31.     //此處還存在對主人對象的引用  
  32.     alert(cat1.getZhuRen().name)  
  33.       //-->  
  34.   </SCRIPT> 

原文鏈接 :http://www.cnblogs.com/a_bu/archive/2011/01/16/1936549.html  

【編輯推薦】

  1. JavaScript懶加載技術(lazyload)簡單實現(xiàn)
  2. jQuery 1.5***個Beta版發(fā)布 付下載
  3. JavaScript初學者應注意的七個細節(jié)
責任編輯:陳貽新 來源: 仰光的博客
相關推薦

2011-07-04 13:12:04

JavaScript

2021-05-27 21:47:12

Python垃圾回收

2013-04-01 10:07:19

Java內存回收機制

2009-12-09 17:28:34

PHP垃圾回收機制

2021-12-07 08:01:33

Javascript 垃圾回收機制前端

2010-09-26 14:08:41

Java垃圾回收

2019-08-19 12:50:00

Go垃圾回收前端

2012-08-13 10:19:03

IBMdW

2010-09-26 16:42:04

JVM內存組成JVM垃圾回收

2023-02-28 07:56:07

V8內存管理

2021-09-26 05:06:46

JS垃圾內存

2019-09-27 09:13:55

Redis內存機制

2011-05-26 15:41:25

java虛擬機

2010-09-25 15:33:19

JVM垃圾回收

2017-03-03 09:26:48

PHP垃圾回收機制

2017-08-17 15:40:08

大數(shù)據(jù)Python垃圾回收機制

2009-06-23 14:15:00

Java垃圾回收

2020-09-27 07:32:18

V8

2011-07-04 16:48:56

JAVA垃圾回收機制GC

2010-09-25 15:26:12

JVM垃圾回收
點贊
收藏

51CTO技術棧公眾號