2、JavaScript高級之詞法分析

JavaScript代碼自上而下執行,但是在js代碼執行前,會首先進行詞法分析,所以事實上,js運行要分爲詞法分析執行兩個階段。

詞法分析

    詞法分析主要分爲3步:
         第1步:分析形參
         第2步:分析變量聲明
         第3步:分析函數聲明

    如果存在函數嵌套,則從外往內進行詞法分析


    具體步驟:
       0:在函數執行的一瞬間,生產 Active Object(活動對象),下面簡稱AO
       1:
           1.1 函數聲明的形參,形成AO的屬性,默認值是undefined,
           1.2 接收形參,給剛剛形成AO的屬性的形參賦值
       2:分析var聲明變量!如 var age;(變量的值是在運行時期決定)
           2.1 如果AO上還沒有age屬性,則給AO添加age屬性,默認值是undefined
           2.2 如果AO上已經有age屬性,則不做任何操作。
       3:分析函數聲明!如 function foot(){}
          3.1 如果AO上沒有foot屬性,則把函數賦給AO.foot屬性
          3.2 如果AO上有foot屬性,則會直接覆蓋,把函數賦給AO.foot屬性

代碼演示與分析:

  function a(b){
       alert(b);
       function b(){
           alert(b);
       }
       b();
   }
   a(1);
這是個常見的JavaScript面試題,如果不懂JavaScript的詞法分析,根本看不懂,下面就按照JavaScript的詞法步驟進行分析,前面說過JavaScript自上而下執行,但是先進行詞法分析後執行代碼
 
     分析過程:
     0、形成活動對象AO={}
     1、分析形參,--> AO={b:undefined};  分析傳參,--> AO={b:1}
     2、分析變量聲明var,沒有
     3、分析函數聲明,AO.b=function(){alert(b);},執行覆蓋操作
    
     執行過程:
      alert(b);//function
      b();    // 執行function b...alert(b),在函數b的作用域內部找不到b,根據作用域鏈原理(見上一篇http://blog.csdn.net/guixuecheng/article/details/43670323)往外層尋找,找到b就是函數自己,打印出function ...

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章