JavaScript詞法分析(盡力理解)
阿新 • • 發佈:2018-07-23
中間 fun 使用 fine 例子 參數 code class 過程
JavaScript中在調用函數的那一瞬間之前,會先進行詞法分析
詞法分析的過程:
當函數調用的前一瞬間,會先形成一個激活對象:Avtive Object(AO),並會分析以下3個方面:
1:函數參數,如果有,則將此參數賦值給AO,且值為undefined。如果沒有,則不做任何操作。
2:函數局部變量,如果AO上有同名的值,則不做任何操作。如果沒有,則將此變量賦值給AO,並且值為undefined。
3:函數聲明,如果AO上有,則會將AO上的對象覆蓋。如果沒有,則不做任何操作。
函數內部無論是使用參數還是使用局部變量都到AO上找
看兩個例子:
第一個:
1 var age = 18; 2 functionfoo(){ 3 console.log(age); 4 var age = 22; 5 console.log(age); 6 } 7 8 foo(); // 問:執行foo()之後的結果是?
第二個:
1 var age = 18; 2 function foo(){ 3 console.log(age); 4 var age = 22; 5 console.log(age); 6 function age(){ 7 console.log("呵呵"); 8 } 9 console.log(age); 10 } 11 12foo(); // 執行後的結果是?
最後答案解析:
第一題:
undefined 22
1 過程: 2 執行前有一個局部變量,形成AO.age = undefined 3 開始執行,第一個輸出age,此時age為undefined,輸出undefined 4 賦值22給age 5 第二個輸出age,此時age已經有了值就輸出22
第二題:
先輸出函數 然後是兩個22
1 詞法分析過程: 2 1、分析參數,有一個參數,形成一個 AO.age=undefine; 3 2、分析變量聲明,有一個 var age, 發現 AO 上面已經有一個 AO.age,因此不做任何處理4 3、分析函數聲明,有一個 function age(){...} 聲明, 則把原有的 age 覆蓋成 AO.age=function(){...}; 5 6 最終,AO上的屬性只有一個age,並且值為一個函數聲明 7 8 執行過程: 9 註意:執行過程中所有的值都是從AO對象上去尋找 10 11 1、執行第一個 console.log(age) 時,此時的 AO.age 是一個函數,所以第一個輸出的一個函數 12 2、這句 var age=22; 是對 AO.age 的屬性賦值, 此時AO.age=22 ,所以在第二個輸出的是 2 13 3、同理第三個輸出的還是22, 因為中間再沒有改變age值的語句了 14
JavaScript詞法分析(盡力理解)