亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js標記清楚的過程理解

js標記清楚的過程理解

喵喵時光機 2019-04-27 17:18:59
垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記。然后,它會去掉環境中的變量以及被環境中的變量引用的變量的標記。而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了。感覺這些話說的讓我難以理解。尤其這句話(它會去掉環境中的變量以及被環境中的變量引用的變量的標記。而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了)請懂得老哥們不嫌麻煩就下面的例子解釋一下這話的含義。謝謝了functiontes(){vara=3;varb=2;varc=a;}tes()
查看完整描述

2 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

環境中的變量你可以理解為正在使用的變量。
這句話的意思是說,先認為所有對象都是要清除的,然后遍歷正在使用的那些對象,以及由那些對象所引用的其他對象。所有這些對象都找出來之后,剩下的就是沒有在使用的對象了,就可以被垃圾回收了。
標記清除的好處就是可以解決循環引用問題。a和b相互引用,引用計數都是1,所以只用引用計數的話兩個都沒辦法回收。但是用標記清除就可以。
標記有用對象的過程其實就是可達測試的過程。你可以想象整個內存是一個大海,每個對象都是一個島嶼,相互之間用大橋連接,現在要找出與大陸相連的島嶼,那么就從大陸出發,依次標記所能達到的每個島嶼,最后沒有被標記到的島嶼就是孤島,可以當垃圾清除掉。即使兩個孤島之間相互有橋連接也沒用,因為與大陸不通啊。
這個大陸就是應用程序,或者說是應用程序里的根對象。每次遍歷的時候都是從這個根對象出發的。
不知道這么說你能明白嗎?
最后再來說說你題目里那個例子。你那個例子是不恰當的,因為abc三個變量都是臨時變量,存在于棧中,會自動回收。它們的值是原始類型,不是對象,因此也不存在垃圾回收的問題。記住垃圾回收只作用于對象。
所以你的例子當函數執行完之后,這些臨時變量和它們的值呼啦一下都沒了,根本沒有垃圾回收什么事兒。
                            
查看完整回答
反對 回復 2019-04-27
  • 2 回答
  • 0 關注
  • 347 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號