成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入解讀JavaScript內存回收機制

開發 前端
本文介紹的是JavaScript內存回收機制,希望對你有幫助,一起來看。

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

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

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

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

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

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

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

2.抽象理解GC

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

Javascript閉包(closure) 深入淺出 , 其中雙向鏈表描述復雜對象的上下層級關系. 作用域鏈與活動對象分別是雙向鏈表中的某個節點.以函數cc為例變量層級關系為:

  1. window<=>cc<=>a1<=>rr   
  2. <=>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無法回收目標對象.例如:

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

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

【編輯推薦】

  1. JAVA開發 分析JNI標準原理
  2. 談JAVA靜態載入的兩種方式
  3. 談JavaScript中的移除空事件處理程序
  4. 談JavaScript中的事件委托
  5. 詳解JavaScript之分解任務
責任編輯:于鐵 來源: 互聯網
相關推薦

2011-01-18 14:06:58

JavaScriptweb

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

2023-02-28 07:56:07

V8內存管理

2010-09-26 16:42:04

JVM內存組成JVM垃圾回收

2021-09-26 05:06:46

JS垃圾內存

2011-05-26 15:41:25

java虛擬機

2019-09-27 09:13:55

Redis內存機制

2010-09-25 15:33:19

JVM垃圾回收

2017-03-03 09:26:48

PHP垃圾回收機制

2017-08-17 15:40:08

大數據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-16 15:10:24

JVM垃圾回收機制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人高潮片免费视频欧美 | 国产精品免费一区二区三区 | 国内精品免费久久久久软件老师 | 日韩久久久久久久 | 日韩精品区| 国产一区二区免费电影 | 欧美视频三区 | 黄色片大全在线观看 | 午夜在线 | 欧美老少妇一级特黄一片 | 中文字幕 在线观看 | 在线观看成人 | 久久久免费精品 | 夏同学福利网 | 国产精品视频网 | 天堂一区在线观看 | 男女羞羞视频在线免费观看 | 亚洲欧美视频一区 | 在线视频91 | 国产乱码精品一区二区三区中文 | 精品1区| 日韩欧美在 | 精品一区二区视频 | 久久久青草婷婷精品综合日韩 | 中文字幕日韩欧美 | 91麻豆蜜桃一区二区三区 | 日韩视频一级 | 我爱操| 无码一区二区三区视频 | 久热久热 | 国产福利在线 | 羞羞视频网站免费观看 | 精产国产伦理一二三区 | 亚洲精品美女视频 | 久久伊人一区 | 成人午夜免费福利视频 | 国产精品1区| 日韩一二区 | 日韩中文字幕av | 国产 亚洲 网红 主播 | 欧美自拍第一页 |