堆棧的世界與變量的意義

在瀏覽器的進(jìn)程里面桑驱,不管是在常量池,棧蟀拷,堆中碰纬,我們都是給對象來開辟內(nèi)存空間的萍聊,雖然說對象的分布不同问芬,常量池存放的可能是值類型的對象,堆中可能是引用類型的對象寿桨,那么既然開辟了內(nèi)存此衅,怎樣才能找到它呢? 我們根據(jù)內(nèi)存地址來找到它 亭螟,在JS中我們無法獲取到具體的值挡鞍,我們只能知道它是通過16進(jìn)制的方式 瀏覽器自動分配的,是類似@123abc這樣预烙。

我們通過變量來拿到對象的內(nèi)存地址墨微,在這里我們叫做引用。

1.變量聲明

var c = {};
當(dāng)我們聲明一個變量c扁掸,我們在內(nèi)存中做了什么呢翘县?

1.在棧中開辟一塊內(nèi)存空間 名字叫c
2.把對象的內(nèi)存地址 @123abc 給到變量c進(jìn)行存儲

這個過程在c語言中叫指針的過程 最域,在JS中叫做引用的過程;
我們把內(nèi)存地址給了變量C 進(jìn)行存儲 訪問時候?qū)嶋H上是根據(jù)當(dāng)前的變量存儲的地址锈麸,找到了
我對應(yīng)的內(nèi)存空間 镀脂。

變量的意義就是來存儲對象的內(nèi)存地址,我們通過存儲的內(nèi)存地址來找到對象的內(nèi)存空間忘伞;
這個過程 除了賦值之外薄翅,其實還是把我們當(dāng)前對象的內(nèi)存地址賦值,或者說是將內(nèi)存里面的引用 給了我們的變量氓奈。

當(dāng)我們輸出typeof c; //object 為什么會判定這個變量是object類型呢翘魄?

其實變量本身沒有數(shù)據(jù)類型的,當(dāng)我們訪問變量的數(shù)據(jù)類型的時候探颈,一定是根據(jù)當(dāng)前變量存儲的內(nèi)存地址來找到變量的內(nèi)存空間從而找到這個對象熟丸,去看這個對象是什么數(shù)據(jù)類型 。

我們來驗證一下

比如 var d ;
當(dāng)我們聲明一個變量d伪节,不做任何操作的時候光羞,當(dāng)程序去解析代碼時會在棧中開辟一塊內(nèi)存d出來,當(dāng)我們試圖去訪問d時怀大,輸出什么纱兑?一定是undefined;
同樣輸出他的類型時typeof d; //undefined也是undefined化借;因為變量d中沒有存儲任何的內(nèi)存地址潜慎,什么都沒有,所以就沒有任何的數(shù)據(jù)類型蓖康。

這與之前所理解的 “賦值” 還是有一些差距的

2.語言的執(zhí)行規(guī)則

首先舉一個非常經(jīng)典的例子铐炫。


1.png

按道理說程序應(yīng)該會報錯可為什么會是undefined
很多人解釋說的變量的提升?那么變量的提升究竟是什么東西呢蒜焊?

其實是這樣子的

在腳本語言中的執(zhí)行順序 是 先定義 后執(zhí)行

先定義: 分為 通過var定義變量 和 function聲明函數(shù) 并且從上往下執(zhí)行定義代碼
后執(zhí)行: 除了定義代碼之外其余的全部都是執(zhí)行代碼 也是從上往下執(zhí)行

那么上圖中的代碼執(zhí)行順序就應(yīng)該是這樣的了:

1.定義變量 a var a ;
2 訪問變量a console.log(a);
3 把 1 賦值 給 a a=1(把1在內(nèi)存中的地址賦值給變量a倒信,讓a拿到它的引用)
所以當(dāng)?shù)诙捷敵鯽時 還沒有拿到引用地址,結(jié)果就是undefined了

如果下面還有console.log(a) 那么就會輸出 1了 泳梆,因為a已經(jīng)拿到了1在常量里的內(nèi)存地址a鳖悠。
這就是腳本語言的執(zhí)行規(guī)則,一定是先定義后執(zhí)行优妙。

3.為什么先定義后執(zhí)行呢乘综?

是由于我們內(nèi)存機制所主導(dǎo)的,并不是在信口開河套硼。
在內(nèi)存里面的順序是這樣的:
1.開辟變量的內(nèi)存空間卡辰;
2 拿到變量的內(nèi)存地址;

當(dāng)我們var a = 1; 的時候會在棧中 開辟出一塊內(nèi)存空間 變量a;然后在堆中開辟一塊內(nèi)存空間 @123abc 這個內(nèi)存地址 給到變量a 進(jìn)行存儲九妈;當(dāng)我們console.log(a)訪問變量a的時候會根據(jù)里面存儲的內(nèi)存地址找到對應(yīng)的內(nèi)存空間朴恳。

既然內(nèi)存里面是這么做的,那么腳本語言的執(zhí)行也是這么做的允蚣。
執(zhí)行規(guī)則 是由我們內(nèi)存的機制所主導(dǎo)所以是 先定義 后執(zhí)行

所以于颖,當(dāng)我們寫代碼的順序和執(zhí)行的順序不一致的時候,就會出現(xiàn)一些意想不到的問題嚷兔,變量的提升的本質(zhì)其實也就是先定義后執(zhí)行森渐,而這個順序的根本原因也就是內(nèi)存的機制所決定的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冒晰,一起剝皮案震驚了整個濱河市同衣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壶运,老刑警劉巖耐齐,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒋情,居然都是意外死亡埠况,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門棵癣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辕翰,“玉大人,你說我怎么就攤上這事狈谊∠裁” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵河劝,是天一觀的道長壁榕。 經(jīng)常有香客問我,道長赎瞎,這世上最難降的妖魔是什么牌里? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮煎娇,結(jié)果婚禮上二庵,老公的妹妹穿的比我還像新娘贪染。我一直安慰自己缓呛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布杭隙。 她就那樣靜靜地躺著哟绊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痰憎。 梳的紋絲不亂的頭發(fā)上票髓,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天攀涵,我揣著相機與錄音,去河邊找鬼洽沟。 笑死以故,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裆操。 我是一名探鬼主播怒详,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼踪区!你這毒婦竟也來了昆烁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤缎岗,失蹤者是張志新(化名)和其女友劉穎静尼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體传泊,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鼠渺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眷细。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片系冗。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖薪鹦,靈堂內(nèi)的尸體忽然破棺而出掌敬,到底是詐尸還是另有隱情,我是刑警寧澤池磁,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布穆咐,位于F島的核電站,受9級特大地震影響异雁,放射性物質(zhì)發(fā)生泄漏窘行。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一端考、第九天 我趴在偏房一處隱蔽的房頂上張望雅潭。 院中可真熱鬧,春花似錦却特、人聲如沸扶供。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椿浓。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扳碍,已是汗流浹背提岔。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笋敞,地道東北人碱蒙。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像夯巷,于是被迫代替她去往敵國和親振亮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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