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 ...