JS 預(yù)編譯

JS 運(yùn)行三部曲

語法分析

語法分析很簡(jiǎn)單南片,就是引擎檢查你的代碼有沒有什么低級(jí)的語法錯(cuò)誤

預(yù)編譯

預(yù)編譯發(fā)生在代碼執(zhí)行的前一刻,預(yù)編譯簡(jiǎn)單理解就是在內(nèi)存中開辟一些空間,存放一些變量與函數(shù) 愁铺;

解析執(zhí)行

解釋執(zhí)行顧名思義便是執(zhí)行代碼了

預(yù)編譯前奏

暗示全局變量 imply global

任何變量,如果變量未經(jīng)申明就賦值,此變量就為 全局對(duì)象 所有。

    a = 1;
    console.log(window.a);
    function test() {
        var a = b = 2;
    }
    test();
    console.log(window.b);

全局變量

一切申明的 全局變量, 全是 window 的屬性, window 就是全局的域

GO 和 AO

JS 在執(zhí)行前會(huì)產(chǎn)生一個(gè) GO ,也就是我們說的全局作用域 。 當(dāng)一個(gè)方法被調(diào)用時(shí)會(huì)形成一個(gè)局部作用域 AO

全局代碼在執(zhí)行的時(shí)候,先是 變量提升 , 在全局作用域內(nèi)添加 屬性,然后是 函數(shù)(以函數(shù)聲明創(chuàng)建的函數(shù))提升,再是代碼執(zhí)行

我們先來個(gè)簡(jiǎn)單的小栗子來看看

    var b = 2;
    console.log(b); 
    console.log(b);
    var b = 2;

此時(shí)我們打印出來 b 的值為 undefined,那我們不定義 b 直接 打印 b 是什么情況呢

console.log(b);

結(jié)果如上圖 瀏覽器報(bào)錯(cuò).

為什么在 console.log 前育韩,后和不定義 b 會(huì)有如此大的差別,這就是預(yù)編譯起到的作用

我們?cè)倏纯聪旅孢@個(gè)列子

    console.log(a);
    var a = 123;
    function a() {
    }
    console.log(a);
微信圖片_20200111143158.png

結(jié)果怎么來的呢???

那我們就得看下面的 預(yù)編譯 四部曲

預(yù)編譯四部曲

  • 創(chuàng)建 GO/AO 對(duì)象

  • 找形參和變量申明,將變量和形參名作為 AO 屬性名,值為 undefined

  • 將實(shí)參值和形參值統(tǒng)一

  • 在函數(shù)體里面找函數(shù)申明,值賦予 函數(shù)體

這四部是什么意思呢,我們舉個(gè)例子看看:

    function fn(a) {
        console.log(a);
        var a = 123;
        console.log(a);
        function a() { }

        console.log(a);
        console.log(b);
        var b = function () { }
        console.log(b);
    }
    fn(1);

大家覺得應(yīng)該輸出什么呢?

我們來分析下:

首先方法調(diào)用形成一個(gè)局部 *AO


AO{

}

找方法里面的形參和變量申明, fn 里面 只有 a 和 b,作為 AO 的屬性并把值設(shè)置為 undefined


AO{
    a:undefined,
    b:undefined
}

然后將形參和實(shí)參的值統(tǒng)一,什么意思呢,就是給 形參 a 賦值為 實(shí)參 1,此時(shí)的 AO:


AO{
    a:1,
    b:undefined
}

最后一步函數(shù)體找函數(shù)申明,并賦值為函數(shù)體, 我們找到了 函數(shù)申明 function a() { } ,有人會(huì)問 b呢,不好意思 b 是 函數(shù)表達(dá)式,因此忽略,此時(shí) AO 為:


AO{
    a:function a() { },
    b:undefined
}

到此 函數(shù)預(yù)編譯完成,下面開始執(zhí)行:

  • 第一次 console.log(a) 打印即為 AO 里面的 a => function a() { }

  • 第二次 console.log(a) 執(zhí)行 a 的賦值,此時(shí) a =>123

  • 第三次 console.log(a) 函數(shù)function a() { } 已經(jīng)預(yù)編譯申明過, 因此直接忽略, a 還是為 123

  • 第一次 console.log(b) 打印即為 AO 里面的 b => undefined

  • 第二次 console.log(b) 執(zhí)行 b 的賦值,此時(shí) b =>function () { }

我們來看看打印的是否如我們分析的這樣:


fn.png

看來沒有問題筑舅。

好了,我們已經(jīng)知道了 預(yù)編譯的過程,那讓我們?cè)賮硪活}看看:


function test() {
    console.log(b);
    if (a) {
        var b = 100;
    }
    
    c = 234;
    console.log(b);

    console.log(c);
}

var a;
test();
a = 10;
console.log(a);
console.log(c);

一樣的,我們首先生成 GO,AO

GO{
    a:undefined
}

AO{
    b:undefined
}
  • 第一次打印 b 的值 為 undefined 沒問題,

  • 此時(shí) AO 中沒有a 屬性,往上找全局屬性 GO ,ok a 為 undefined,條件不成立 b 還是 undefined

  • 打印 c 沒什么好說的,直接就是 234

  • 函數(shù) test() 執(zhí)行完畢 下面 a 進(jìn)行復(fù)制, 因此 打印 a 為 10

  • 打印 c 相當(dāng)于 訪問 window.c 因此還是 234

小練習(xí)


    a = 100;
    function deme(e) {
        function a() { }
        arguments[0] = 2;
        console.log(e);
        if (a) {
            var b = 123;
            var c = function () { }
        }
        var c;
        a = 10;
        var a;
        console.log(b);
        f = 123;
        console.log(c);
        console.log(a);
    }

    var a;
    deme(1);
    console.log(a);
    console.log(f);

總結(jié)

  1. 未經(jīng)申明就賦值,此變量就是全局變量所有,一切申明的全局變量,全是 window 屬性

  2. 預(yù)編譯發(fā)生在 變量申明函數(shù)申明, 匿名函數(shù)函數(shù)表達(dá)式 不參與預(yù)編譯

  3. 變量 聲明提升—無論變量調(diào)用和聲明的位置是前是后,系統(tǒng)總會(huì)把聲明移到調(diào)用前,注意僅僅只是聲明座慰,所以值是 undefined

  4. 函數(shù)聲明整體提升-無論函數(shù)調(diào)用和聲明的位置是前是后陨舱,系統(tǒng)總會(huì)把函數(shù)聲明移到調(diào)用前面.如果函數(shù)名同形參或變量名同名,則會(huì)賦值為 函數(shù)體

  5. 只有在解析執(zhí)行才會(huì)對(duì)變量初始化

覺得不錯(cuò)請(qǐng)幫忙點(diǎn)個(gè)贊,謝謝!!!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翠拣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子游盲,更是在濱河造成了極大的恐慌误墓,老刑警劉巖蛮粮,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谜慌,居然都是意外死亡然想,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門欣范,熙熙樓的掌柜王于貴愁眉苦臉地迎上來变泄,“玉大人,你說我怎么就攤上這事恼琼》劣迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵晴竞,是天一觀的道長蛙卤。 經(jīng)常有香客問我,道長噩死,這世上最難降的妖魔是什么颤难? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮已维,結(jié)果婚禮上行嗤,老公的妹妹穿的比我還像新娘。我一直安慰自己垛耳,他們只是感情好昂验,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艾扮,像睡著了一般既琴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泡嘴,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天甫恩,我揣著相機(jī)與錄音,去河邊找鬼酌予。 笑死磺箕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抛虫。 我是一名探鬼主播松靡,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼建椰!你這毒婦竟也來了雕欺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屠列,沒想到半個(gè)月后啦逆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笛洛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年夏志,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苛让。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沟蔑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狱杰,到底是詐尸還是另有隱情溉贿,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布浦旱,位于F島的核電站宇色,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颁湖。R本人自食惡果不足惜宣蠕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甥捺。 院中可真熱鬧抢蚀,春花似錦、人聲如沸镰禾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吴侦。三九已至屋休,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間备韧,已是汗流浹背劫樟。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留织堂,地道東北人叠艳。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像易阳,于是被迫代替她去往敵國和親附较。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 預(yù)編譯是js的一個(gè)特色潦俺,也算是閉包之前最難的一個(gè)知識(shí)點(diǎn)拒课。 預(yù)編譯有4句公式徐勃,而這4句公式只要背熟就能理解預(yù)編譯。 ...
    德育處主任閱讀 1,443評(píng)論 0 7
  • 之前學(xué)習(xí)了一些預(yù)編譯的知識(shí)捕发,一直沒有作總結(jié),今天總結(jié)一下很魂。 大家都知道扎酷,javascript是解釋性語言,主要特點(diǎn)...
    蛋撻一點(diǎn)也不甜閱讀 401評(píng)論 1 0
  • 輸出: 原因: js執(zhí)行前會(huì)進(jìn)行預(yù)編譯全局預(yù)編譯GO(Global Object)創(chuàng)建GO對(duì)象給全局變量賦值 un...
    文刀強(qiáng)閱讀 1,859評(píng)論 0 2
  • JS三部曲:語法分析:js代碼的執(zhí)行是讀一行代碼執(zhí)行一行遏匆,但在執(zhí)行之前系統(tǒng)會(huì)先對(duì)js進(jìn)行全面掃描檢查是否存在低級(jí)的...
    WangYatao閱讀 1,880評(píng)論 0 4
  • 6歲時(shí)我最想要個(gè)芭比娃娃幅聘,可以每天給她穿衣服凡纳,12歲時(shí)我想數(shù)學(xué)可以考100分,父母可以請(qǐng)我吃好吃的帝蒿,18歲時(shí)我...
    思域22閱讀 318評(píng)論 1 0