1. 程式人生 > >JavaScript詞法分析(重點理解)

JavaScript詞法分析(重點理解)

                    javascript詞法分析

JavaScript中在呼叫函式的那一瞬間,會先進行詞法分析。
詞法分析的過程:
當函式呼叫的一瞬間,會先形成一個啟用物件:Active Object(AO),並會分析一下3個方面
01:函式引數,如果有,則會將此引數賦值給AO,且值為undefined。如果沒有,則不做任何操作
02:函式區域性變數,如果AO上有同名的值,則不做任何操作,如果沒有,則將此變數賦值給AO,並且值為undefined
03:函式宣告,如果AO上有,則會將AO上的物件覆蓋,如果沒有,則不做任何操作。

詞法分析例子01:

var age=18; //(第二部:發現沒有函式引數,不做任何操作)

function foo(){

//(第三步,發現下面有區域性變數age的宣告,此時的AO的變數名字是age,且值為undefined()
//即:age=undefined。所以這時的age的值是undefined 在這之前是還未執行到age=22的。)

console.log(age);
var age=22; //如果沒有這個變數宣告,列印的值應該是18
console.log(age);
}

foo(); //呼叫函式,(第一步:瞬間形成了一個AO物件)

//呼叫函式得到的值
--> undefined

-->22

詞法分析例子02:

var age=18;
function foo(){
console.log(age);
var age=22;
console.log(age);
function age(){ //#發現age這個函式名也是變數,將OA上的變數給替換了,那麼函式在執行的時候,
//去OA上找,發現OA是個函式,然後執行到age=22的時候,age才被重新賦值
console.log("呵呵");
}
console.log(age);
}

foo(); //呼叫執行函式


結果:

--> ƒunction age(){
console.log("呵呵");
}
--> 22
--> 22

////////////////重點理解//////////////
結果分析:
詞法分析過程:

1、分析引數,有一個引數,形成一個 AO.age=undefine;//??????????????這裡的 var age=18; 是一個引數???????
2、分析變數宣告,有一個 var age, 發現 AO 上面已經有一個 AO.age,因此不做任何處理
3、分析函式宣告,有一個 function age(){...} 宣告, 則把原有的 age 覆蓋成 AO.age=function(){...};
最終,AO上的屬性只有一個age,並且值為一個函式宣告

執行過程:
注意:執行過程中所有的值都是從AO物件上去尋找
1、執行第一個 console.log(age) 時,此時的 AO.age 是一個函式,所以第一個輸出的一個函式
2、這句 var age=22; 是對 AO.age 的屬性賦值, 此時AO.age=22 ,所以在第二個輸出的是 22
3、同理第三個輸出的還是22, 因為中間再沒有改變age值的語句了