JavaScript預編譯(執(zhí)行期上下文)

什么是預編譯茁帽?

前端同學都知道js里有個叫變量聲明提升的概念,其實這就是預編譯造成的吊输。預編譯也叫執(zhí)行期上下文铁追。當js代碼運行的時候,實際上是運行在執(zhí)行期上下文里面扭屁,執(zhí)行期上下文包含三種涩禀。

  • 全局上下文(Global Object,即全局代碼,簡稱GO)
  • 函數(shù)上下文 (Activation Object艾船,每個函數(shù)在運行的前一刻會創(chuàng)建屬于自己的執(zhí)行期上下文,簡稱AO)
  • eval方法也會創(chuàng)建新的執(zhí)行期上下文 (用的不多屿岂,這里就不說它了)
  var a = 1;
  var b = 2;
  
  function add(x,y) {
      return x + y;
  }
  
  add(1,2)
  
  // 1. 執(zhí)行代碼爷怀,首先創(chuàng)建一個全局的GO
  // 2. 運行add函數(shù)的前一刻創(chuàng)建屬于add函數(shù)的AO

執(zhí)行期上下文棧

  1. 全局代碼執(zhí)行前,JS就會創(chuàng)建一個棧來儲存管理所有的執(zhí)行上下文對象
  2. 全局執(zhí)行期上下文確定后,把它添加到棧中(棧底)
  3. 當函數(shù)的執(zhí)行期上下文創(chuàng)建完后烤惊,把它添加到棧中(棧頂)
  4. 當前函數(shù)執(zhí)行完畢,在棧頂把這個函數(shù)的執(zhí)行期上下文移出
    • 函數(shù)執(zhí)行中,遇到return直接終止可執(zhí)行的代碼,會直接將當前上下文彈出棧
  5. 全部代碼執(zhí)行完畢瘤缩,棧里就只剩全局的執(zhí)行期上下文了
  6. 當瀏覽器窗口關閉伦泥,移出全局的執(zhí)行期上下文

執(zhí)行期上下文創(chuàng)建過程

AO

  1. 創(chuàng)建AO對象(Activation Object)
  2. 找形參和變量聲明不脯,將變量和形參名作為 AO 屬性名,值為 undefined
  3. 將實參和形參相統(tǒng)一
  4. 在函數(shù)體里面找函數(shù)聲明防楷,值賦予函數(shù)體
  function fn(a,b){
    console.log(a);
    c = 0;
    var c;
    a = 3;
    b = 2;
    console.log(b);
    function b(){};
    function d(){};
    console.log(b);
  }
  fn(1,2)
  /*
    創(chuàng)建過程:
        1. 創(chuàng)建AO對象
        AO = {
            
        }
        2. 找形參和變量聲明复局,將變量和形參名作為 AO 屬性名,值為 undefined
        AO = {
            a:undedfined,
            b:undefined,
            c:undefined
        }
        3.將實參和形參相統(tǒng)一
        AO = {
            a:1,
            b:2,
            c:undefined
        }
        4. 在函數(shù)體里面找函數(shù)聲明峦剔,值賦予函數(shù)體
        AO = {
            a:1,
            b:function b(){},
            c:undefined,
            d:function b(){}
        }
  */
  /*
    函數(shù)執(zhí)行過程:
    function fn(a,b){
      console.log(a); // 1
      c = 0;          // AO的c變成0
      var c;          // AO創(chuàng)建過了角钩,忽略
      a = 3;          // AO的a變成3
      b = 2;          // AO的b變成2
      console.log(b); // 2
      function b(){}; // AO創(chuàng)建過了递礼,忽略
      function d(){}; // AO創(chuàng)建過了,忽略
      console.log(b); // 2
    }
  */
    
    

GO

  1. 創(chuàng)建GO對象(Global Object)
  2. 找形參和變量聲明辫愉,將變量和形參名作為 GO 屬性名将硝,值為 undefined
  3. 在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體
  console.log(a)
  var a= 1;
  var b;
  function c() {};
  function b() {};
  console.log(c)
  console.log(b)
  b = 2;
  console.log(a)
  console.log(b)
  /*
    創(chuàng)建過程:
        1. 創(chuàng)建AO對象
        AO = {
            
        }
        2. 找形參和變量聲明冀墨,將變量和形參名作為 AO 屬性名涛贯,值為 undefined
        AO = {
            a:undedfined,
            b:undefined,
            c:undefined
        }
        3. 在函數(shù)體里面找函數(shù)聲明蔚出,值賦予函數(shù)體
        AO = {
            a:undedfined,
            b:function b(){},
            c:function c(){},
        }
  */
  /*
    函數(shù)執(zhí)行過程:
    console.log(a) // undefined
    var a= 1;      // GO的a變成1
    var b;         // GO創(chuàng)建過了虫腋,忽略
    function c();  // GO創(chuàng)建過了稀余,忽略
    function b();  // GO創(chuàng)建過了,忽略
    console.log(c) // function c() {}
    console.log(b) // function b() {}
    b = 2;         // GO的b變成2
    console.log(a) // 1
    console.log(b) // 2
  */
    
    

其實全局對比函數(shù)的執(zhí)行期上下文創(chuàng)建過程就是少了個形參和實參統(tǒng)一盒蟆,其余的都一樣

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末历等,一起剝皮案震驚了整個濱河市辟癌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寡夹,老刑警劉巖厂置,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件农渊,死亡現(xiàn)場離奇詭異,居然都是意外死亡砸紊,警方通過查閱死者的電腦和手機传于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醉顽,“玉大人沼溜,你說我怎么就攤上這事∮翁恚” “怎么了系草?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唆涝。 經(jīng)常有香客問我找都,道長,這世上最難降的妖魔是什么廊酣? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上晓猛,老公的妹妹穿的比我還像新娘饿幅。我一直安慰自己,他們只是感情好戒职,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布栗恩。 她就那樣靜靜地躺著,像睡著了一般洪燥。 火紅的嫁衣襯著肌膚如雪磕秤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天捧韵,我揣著相機與錄音亲澡,去河邊找鬼。 笑死纫版,一個胖子當著我的面吹牛床绪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播其弊,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼癞己,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梭伐?” 一聲冷哼從身側(cè)響起痹雅,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糊识,沒想到半個月后绩社,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡赂苗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年愉耙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拌滋。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡朴沿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出败砂,到底是詐尸還是另有隱情赌渣,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布昌犹,位于F島的核電站坚芜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斜姥。R本人自食惡果不足惜鸿竖,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一路操、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧千贯,春花似錦、人聲如沸搞坝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桩撮。三九已至敦第,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間店量,已是汗流浹背芜果。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留融师,地道東北人右钾。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像旱爆,于是被迫代替她去往敵國和親舀射。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

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