javascript數(shù)據(jù)呻逆、變量類型與預(yù)解析

javascript數(shù)據(jù)類型與變量類型如下圖:

javascript數(shù)據(jù)最铁、變量類型.png

執(zhí)行上下文(Execution Context)

每當(dāng)控制器轉(zhuǎn)到可執(zhí)行代碼的時(shí)候棵里,就會(huì)進(jìn)入一個(gè)執(zhí)行上下文,執(zhí)行上下文可以理解為當(dāng)前代碼的執(zhí)行環(huán)境禾进,他會(huì)形成一個(gè)作用域豁跑。javascript中的運(yùn)行環(huán)境大概包括三種:

  • 全局環(huán)境:js代碼運(yùn)行起來首先會(huì)進(jìn)入該環(huán)境。
  • 函數(shù)環(huán)境:當(dāng)函數(shù)被調(diào)用執(zhí)行時(shí),會(huì)進(jìn)入當(dāng)前函數(shù)中的執(zhí)行代碼艇拍。
  • eval(不建議使用狐蜕,可忽略)
  • 因此在一個(gè)javascript程序中,必定會(huì)產(chǎn)生多個(gè)執(zhí)行上下文卸夕,js引擎會(huì)以棧的方式處理他們层释,這個(gè)棧我們稱其為調(diào)用棧(call stack)。棧底永遠(yuǎn)是全局上下文(Global Context)快集,而棧頂就是當(dāng)前執(zhí)行的上下文贡羔。在代碼執(zhí)行過程中,遇到上面3中情況个初,都會(huì)生成一個(gè)執(zhí)行上下文乖寒,放入棧中,而處于棧頂?shù)纳舷挛膱?zhí)行完畢之后院溺,就會(huì)自動(dòng)出棧楣嘁。全局上下文會(huì)在瀏覽器窗口關(guān)閉后出棧。
  • 關(guān)于上下文的總結(jié):
    • 單線程
    • 同步執(zhí)行珍逸,只有棧頂?shù)纳舷挛奶幱趫?zhí)行中逐虚,其他上下文需要等待
    • 全局上下文只有唯一的一個(gè),它在瀏覽器關(guān)閉時(shí)出棧
    • 函數(shù)的執(zhí)行上下文的個(gè)數(shù)沒有限制
    • 每次某個(gè)函數(shù)被調(diào)用谆膳,就會(huì)有個(gè)新的執(zhí)行上下文為其創(chuàng)建叭爱,即使是調(diào)用的自身函數(shù),也是如此摹量。

Reference-執(zhí)行上下文

變量和函數(shù)在內(nèi)存中的展示

  • 基本數(shù)據(jù)類型是直接存在棧內(nèi)存中涤伐,而引用類型是在棧中存儲(chǔ)了指針,該指針指向了堆中該實(shí)體的起始地址缨称。當(dāng)解釋器尋找引用值時(shí)凝果,會(huì)首先檢索其在棧中的地址,取得地址后從堆中獲得實(shí)體睦尽。基本數(shù)據(jù)類型按照值來訪問器净,引用數(shù)據(jù)類型按照引用來訪問
image.png

預(yù)解析(也稱聲明提升):

  • 在ES6之前当凡,變量使用var聲明山害,會(huì)存在變量的預(yù)解析,函數(shù)也有預(yù)解析沿量。所謂預(yù)解析浪慌,就是在當(dāng)前作用域中,javascript代碼執(zhí)行之前朴则,瀏覽器首先會(huì)默認(rèn)的把所有帶varfunction聲明的變量進(jìn)行提前聲明或者定義权纤。
  • 聲明和定義
var num = 1;    
//聲明: var num:告訴瀏覽器在全局作用域有一個(gè)num變量
//定義:num = 1 ;定義就是給變量進(jìn)行賦值
  • var聲明的變量和function聲明的函數(shù)在預(yù)解析的區(qū)別

    var聲明的變量和function聲明的函數(shù)在預(yù)解析的時(shí)候有區(qū)別,var聲明的變量在預(yù)解析的時(shí)候只是提前的聲明汹想,function聲明的函數(shù)在預(yù)解析的時(shí)候會(huì)提前聲明并且會(huì)同時(shí)定義外邓。也就是說var聲明的變量和function聲明的函數(shù)的區(qū)別是在聲明的同時(shí)有沒同時(shí)進(jìn)行定義。下面舉個(gè)例子:

    console.log(num);         //undefined
    console.log(test);            //test函數(shù)體古掏,而不是undefined
    var num = 1;
    function test() {
        console.log('test');
    }
    console.log(num);         //1
    console.log(test);            //test函數(shù)體损话,沒有返回值,所以會(huì)在輸出一個(gè)undefined
    
    image.png
    • 變量對(duì)象的創(chuàng)建過程為:先創(chuàng)建arguments對(duì)象槽唾,然后檢查function函數(shù)聲明創(chuàng)建屬性丧枪,最后檢查var變量聲明創(chuàng)建屬性。因此function聲明會(huì)比var聲明優(yōu)先級(jí)更高一點(diǎn)夏漱,下面舉個(gè)例子:
    console.log(num); //打印出了function num 而不是undefined豪诲。
    var num = 1;
    function num() {
        console.log('test');
    }
    
    image.png

    ?

    預(yù)解析的順序

    • 程序開始先預(yù)解析語法顶捷,標(biāo)點(diǎn)符號(hào)是否有誤挂绰,解析內(nèi)存是否可容納,解析變量……直到解析無誤了服赎,才開始按正常的流程順序走葵蒂。如果沒有預(yù)解析順序,直接按流程順序走重虑,可能程序執(zhí)行到最后一個(gè)函數(shù)践付,發(fā)現(xiàn)了語法錯(cuò)誤,才開始報(bào)錯(cuò)缺厉,那性能要有多差坝栏摺!
    • 順序內(nèi)容:
    1. 文件內(nèi)引用的<script>塊依次解析提针,從上到下連成一片命爬。
    2. 每個(gè)<script>塊內(nèi)的functionvar解析到本塊的開頭辐脖。(先解析function饲宛,再解析var
    3. 依次解析每個(gè)環(huán)境,將function嗜价,var解析到環(huán)境的開頭艇抠。

    ?

reference--JavaScript中的預(yù)解析

reference--作用域鏈,預(yù)解析,復(fù)雜面試題詳解

Reference-執(zhí)行上下文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末久锥,一起剝皮案震驚了整個(gè)濱河市家淤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瑟由,老刑警劉巖絮重,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绿鸣,警方通過查閱死者的電腦和手機(jī)疚沐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潮模,“玉大人亮蛔,你說我怎么就攤上這事∏嫦幔” “怎么了究流?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)动遭。 經(jīng)常有香客問我芬探,道長(zhǎng),這世上最難降的妖魔是什么厘惦? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任偷仿,我火速辦了婚禮,結(jié)果婚禮上宵蕉,老公的妹妹穿的比我還像新娘酝静。我一直安慰自己,他們只是感情好羡玛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布别智。 她就那樣靜靜地躺著,像睡著了一般稼稿。 火紅的嫁衣襯著肌膚如雪薄榛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天让歼,我揣著相機(jī)與錄音敞恋,去河邊找鬼。 笑死是越,一個(gè)胖子當(dāng)著我的面吹牛耳舅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倚评,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼浦徊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了天梧?” 一聲冷哼從身側(cè)響起盔性,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呢岗,沒想到半個(gè)月后冕香,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛹尝,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年悉尾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了突那。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡构眯,死狀恐怖愕难,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惫霸,我是刑警寧澤猫缭,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站壹店,受9級(jí)特大地震影響猜丹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硅卢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一射窒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧老赤,春花似錦轮洋、人聲如沸制市。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祥楣。三九已至开财,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間误褪,已是汗流浹背责鳍。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兽间,地道東北人历葛。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嘀略,于是被迫代替她去往敵國(guó)和親恤溶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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