注意:內(nèi)存圖一到六棧和堆寫反了,斑鸦,應(yīng)該是圖七的樣子愕贡。并且黑色和藍(lán)色筆觸有先后順序
本篇文章用幾道題和他們的內(nèi)存圖來解釋下對(duì)象的引用,以及瀏覽器的垃圾回收機(jī)制.
下面有幾句知識(shí)點(diǎn)需要記下來:
- 所有的變量和對(duì)象之間都是引用關(guān)系巷屿。
- 等于號(hào)只做一件事情固以,就是把右邊的東西存到左邊。
- 如果一個(gè)對(duì)象沒有被引用嘱巾,他就是垃圾憨琳,將被回收。
- 內(nèi)存泄漏就是瀏覽器出了bug旬昭,本應(yīng)該被標(biāo)記為垃圾的栽渴,沒有被標(biāo)記,一直占著內(nèi)存稳懒。
第一部分闲擦、例題:
1、求a是多少场梆?
var a = 1
var b = a
b = 2
a = ?
內(nèi)存圖一:
image.png
解釋:
- 首先墅冷,a=1,接下來,把a(bǔ)的值賦值給b,就是把1存到b里或油,所以寞忿,b也對(duì)應(yīng)了一個(gè)黑色的1。
- 然后顶岸,把值2存到b里腔彰,所以,b現(xiàn)在是藍(lán)色的2.
- 最后得出結(jié)論辖佣,a的值還是1.
2霹抛、求a.name是多少?
var a = {name:'a'}
var b = a
b = {'name':'b'}
a.name = ?
內(nèi)存圖二:
image.png
解釋:
- 首先卷谈,a = {name:'a'},接下來杯拐,把a(bǔ)的值賦值給b,就是把{name:'a'}也存到b里,所以世蔗,b也對(duì)應(yīng)了一個(gè)黑色的地址 address1,此時(shí)a和b都引用棧中的地址1端逼。
- 然后,把 {'name':'b'}存到b里污淋,區(qū)別就在這顶滩,{'name':'b'}會(huì)先在棧里有一個(gè)地址address2,然后寸爆,把這個(gè)地址給b,所以礁鲁,b的堆指向變?yōu)閍ddress2
- 最后得出結(jié)論浊吏,a的name還是a.
3、求a.name是多少救氯?
var a = {name:'a'}
var b = a
b.name='b'
a.name = ?
內(nèi)存圖三:
image.png
解釋:
- 首先,a = {name:'a'},接下來歌憨,把a(bǔ)的值賦值給b,就是把{name:'a'}也存到b里着憨,所以,b也對(duì)應(yīng)了一個(gè)黑色的地址 address1,此時(shí)a和b都引用棧中的地址1务嫡。
- 然后甲抖,把 'b'賦值給b的name,而b的name就是棧中的地址1的name心铃。
- 最后得出結(jié)論准谚,a的name是b.
4、求a = 去扣?
var a = {name:'a'}
var b = a
b=null
a = ?
內(nèi)存圖四:
image.png
解釋:
- 首先柱衔,a = {name:'a'},接下來,把a(bǔ)的值賦值給b,就是把{name:'a'}也存到b里愉棱,所以唆铐,b也對(duì)應(yīng)了一個(gè)黑色的地址 address1,此時(shí)a和b都引用棧中的地址1。
- 然后奔滑,把 null賦值給b艾岂,null的類型雖然是object,但是還是屬于基本類型朋其,所以王浴,直接寫在堆里。
- 最后得出結(jié)論梅猿,a= {name:'a'}
5氓辣、
var a;
a = {self:a}
a.self 即為undefined
a = {self:undefined}
解釋:
- 首先袱蚓,self對(duì)應(yīng)的a還未定義完畢筛婉,所以是undefined.
6、求a .self.self.self....癞松?
var a = {}
a.self = a
內(nèi)存圖六:
image.png
解釋:
- 如圖爽撒,
7、求a.x = 响蓉?b.x = 硕勿?
var a = {n:1}
var b = a
a.x = a = {n:2}
a.x = ?
b.x = ?
內(nèi)存圖七:
image.png
解釋:
- 首先,a = {n:1},接下來枫甲,把a(bǔ)的值賦值給b,就是把{n:1}也存到b里源武,所以扼褪,b也對(duì)應(yīng)了一個(gè)黑色的地址 address1,此時(shí)a和b都引用棧中的地址1。
- 然后粱栖,瀏覽器從左向右讀取话浇,a.x = a,是指a有一個(gè)x等于a,接著又讀到a = {n:2}闹究,所以幔崖,中間的a,是棧里面的地址2,但是最左的x渣淤,依然表示的address1,所以赏寇,棧里面的address1有一個(gè)x,值為address2.所以,最后的a即為address2.
- a.x,由于a現(xiàn)在指向了address2价认,沒有x嗅定,所以為undefined. b.x自然就為[object object]
第二部分、垃圾回收:
舉例:
1用踩、
var a = {name:'a'}
var b = {name:'b'}
a = b
內(nèi)存圖1:
image.png
解釋:
- 首先渠退,a = {n:1},接下來,把a(bǔ)的值賦值給b,就是把{n:1}也存到b里脐彩,所以智什,b也對(duì)應(yīng)了一個(gè)黑色的地址 address1,此時(shí)a和b都引用棧中的地址1。
2丁屎、
var fn = function(){}
document.body.onclick = fn
fn = null
內(nèi)存圖2:
image.png
解釋:
- 但是如果關(guān)了頁(yè)面document就不存在了荠锭,因此就變成了垃圾。
- 在IE6中存在著內(nèi)存泄漏的問題晨川,就是瀏覽器出了bug证九,本該被標(biāo)記為垃圾的沒有被標(biāo)記,就一直占據(jù)著內(nèi)存共虑。所以愧怜,解法為:
window.onunload = function(){
document.body.onclick = null://這里代指事件,真正寫的時(shí)候只要是有的事件都要設(shè)置為null妈拌。
}
畫圖不易拥坛,且看且珍惜,如果要轉(zhuǎn)載請(qǐng)注明出處哦~~