js內(nèi)存空間及this關(guān)鍵詞詳解

前言


理解js內(nèi)存空間员凝,對于我們理解很多題目大有幫助,特別是一些面試項目奋献。例如下面這個題目:

var a = 20 ;
var b = a ;
b = 30 ;
// 這時a的值是多少?

var m = { a : 10 , b : 20}
var n = m ;
n.a = 15;
// 這時m.a的值是多少

很多朋友搞不清楚健霹。
還有一個this方面的面試題目。大體如下:

 var a = 20;
    var haoroomsobj = {
        a: 10,
        c: this.a + 20,
        fn: function () {
            return this.a;
        }
    }

    console.log(haoroomsobj.c);
    console.log(haoroomsobj.fn());
var haoobj=haoroomsobj.fn;
console.log(haoobj())

大家看看上面會輸出什么瓶蚂?下面我就和大家一起來剖析一下這兩個問題糖埋。這兩個問題涉及到js內(nèi)存空間及this關(guān)鍵詞的相關(guān)知識,通過普及這些知識扬跋,來順便解釋一下這兩個題目阶捆。

js內(nèi)存空間


前面我有文章解釋過如何應對js頁面中的[內(nèi)存泄露],但是并沒有解釋js內(nèi)存空間的一些基礎(chǔ)知識钦听。下面我們先來理一下一個概念洒试。

棧與堆

變量對象與基礎(chǔ)數(shù)據(jù)類型(例如:Undefined、Null朴上、Boolean垒棋、Number、String)都放在棧(stack)里
引用數(shù)據(jù)類型痪宰,比如:對象叼架,數(shù)組等一般都放在堆(heap)里

例如如下代碼:

var a1 = 0;   // 變量對象
var a2 = 'this is string'; // 變量對象
var a3 = null; // 變量對象

var b = { m: 20 }; // 變量b存在于變量對象中也可以理解為棧,{m: 20} 作為對象存在于堆內(nèi)存中
var c = [1, 2, 3]; // 變量c存在于變量對象中也可以理解為棧衣撬,[1, 2, 3] 作為對象存在于堆內(nèi)存中

基礎(chǔ)數(shù)據(jù)類型也可以理解為棧里的數(shù)據(jù)都是按值訪問乖订,我們可以直接操作保存在變量中的實際的值。但是在堆內(nèi)存中具练,我們不能直接操作對象的堆內(nèi)存空間乍构。在操作堆里的對象時,實際上是在操作對象的引用而不是實際的對象扛点。因此哥遮,引用類型的值都是按引用訪問的。我們可以地把引用理解為保存在變量對象中的一個地址陵究,這個地址是和堆內(nèi)存的值是相關(guān)聯(lián)的眠饮。

那么上面的面試題目我們可以用如下圖來解釋:

this.png

因此a還是20


第二個題目:

aaa.png

復制之后是引用的復制。修改了堆里面的對象之后铜邮,n和m對應的是同一個對象仪召,因此輸出m.a會變成15

關(guān)于this


關(guān)于this的解釋,我前面也有過一篇文章松蒜,雖然寫了一點點東西返咱,但是寫的比較淺。下面我就詳細介紹一下this
函數(shù)中的this是難點和重點牍鞠,我今天主要講講函數(shù)中的this
我對函數(shù)調(diào)用總結(jié)了如下三點:

1咖摹、this的指向,是在函數(shù)被調(diào)用的時候確定的
2难述、函數(shù)調(diào)用時萤晴,看其是否被某個對象所擁有,假如被某個對象擁有,那么函數(shù)中的this毅整,指向的是其擁有的對象嫁艇。
例如:

haoroomsobj.fn()

fn()函數(shù)被haoroomsobj所擁有,那么fn里面的this屯断,指向的是haoroomsobj
3、如果函數(shù)獨立調(diào)用,那么該函數(shù)內(nèi)部的this殖演,則指向undefined氧秘。在非嚴格模式中,當this指向undefined時趴久,它會被自動指向全局對象丸相。
例如haoobj() 是獨立調(diào)用,那么haoobj函數(shù)里面的this會指向undefined彼棍,在非嚴格模式下面指向的是全局對象灭忠。

通過上面的三條結(jié)論,我們對于函數(shù)的調(diào)用應該很清楚了座硕,我們再來看下:

haoroomsobj.c

這個不是我們上面所說的函數(shù)情況弛作,因此,還有一個結(jié)論:

當haoroomsobj 在全局聲明時华匾,無論haoroomsobj.c在什么地方調(diào)用映琳,這里的this都指向全局對象,
而當haoroomsobj在函數(shù)環(huán)境中聲明時瘦真,這個this指向undefined刊头,在非嚴格模式下,會自動轉(zhuǎn)向全局對象诸尽。

我們再來看下上面的題目吧:

console.log(haoroomsobj.c);
console.log(haoroomsobj.fn());
 var haoobj=haoroomsobj.fn;
console.log(haoobj())

通過上面的結(jié)論原杂,我們可以解釋:

console.log(haoroomsobj.c)


haoroomsob是全局聲明haoroomsobj.c在非嚴格模式下面指向的是window全局對象,因此:

this.a + 20

輸出40

console.log(haoroomsobj.fn());


fn()是haoroomsobj對象下面的函數(shù)您机,這里this指向的是haoroomsobj穿肄,因此輸出的是10

console.log(haoobj())


haoobj()函數(shù)是獨立調(diào)用,指向的是全局际看,因此輸出20

小結(jié)


js內(nèi)存空間咸产,關(guān)鍵理清堆里面的數(shù)據(jù),在操作堆里的對象時仲闽,實際上是在操作對象的引用而不是實際的對象脑溢。

this關(guān)鍵詞要理清函數(shù)調(diào)用,是獨立調(diào)用還是被某個對象所調(diào)用赖欣。獨立調(diào)用在非嚴格模式下面指向的是全局屑彻,被某個對象所調(diào)用,this指向的是某個對象顶吮!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末社牲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子悴了,更是在濱河造成了極大的恐慌搏恤,老刑警劉巖违寿,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熟空,居然都是意外死亡藤巢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門痛阻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菌瘪,“玉大人腮敌,你說我怎么就攤上這事阱当。” “怎么了糜工?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵弊添,是天一觀的道長。 經(jīng)常有香客問我捌木,道長油坝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任刨裆,我火速辦了婚禮澈圈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帆啃。我一直安慰自己瞬女,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布努潘。 她就那樣靜靜地躺著诽偷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疯坤。 梳的紋絲不亂的頭發(fā)上报慕,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音压怠,去河邊找鬼眠冈。 笑死,一個胖子當著我的面吹牛菌瘫,可吹牛的內(nèi)容都是我干的蜗顽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼突梦,長吁一口氣:“原來是場噩夢啊……” “哼诫舅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宫患,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤刊懈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虚汛,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匾浪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卷哩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛋辈。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖将谊,靈堂內(nèi)的尸體忽然破棺而出冷溶,到底是詐尸還是另有隱情,我是刑警寧澤尊浓,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布逞频,位于F島的核電站,受9級特大地震影響栋齿,放射性物質(zhì)發(fā)生泄漏苗胀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一瓦堵、第九天 我趴在偏房一處隱蔽的房頂上張望基协。 院中可真熱鬧,春花似錦菇用、人聲如沸澜驮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泉唁。三九已至,卻和暖如春揩慕,著一層夾襖步出監(jiān)牢的瞬間亭畜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工迎卤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拴鸵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓蜗搔,卻偏偏與公主長得像劲藐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子樟凄,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 沒搞錯吧聘芜!js寫了那么多年,this還是會搞錯缝龄!沒搞錯汰现,javascript就是回搞錯挂谍! ………… 在寫java的...
    zhoulujun閱讀 1,436評論 0 11
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情瞎饲,實現(xiàn)同樣的效果;這時候需要使用工廠模式口叙。簡單...
    舟漁行舟閱讀 7,724評論 2 17
  • 首先必須要說的是,this的指向在函數(shù)定義的時候是確定不了的嗅战,只有函數(shù)執(zhí)行的時候才能確定this到底指向誰妄田,實際上...
    web蝸牛閱讀 578評論 1 4
  • 1,javascript 基礎(chǔ)知識 Array對象 Array對象屬性 Arrray對象方法 Date對象 Dat...
    Yuann閱讀 896評論 0 1
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,309評論 24 450