1. 程式人生 > >javascript中的詞法分析

javascript中的詞法分析

詞法分析

JavaScript中在呼叫函式的那一瞬間,會先進行詞法分析。

詞法分析的過程:

當函式呼叫的前一瞬間,會先形成一個啟用物件:Avtive Object(AO),並會分析以下3個方面:

1:函式引數,如果有,則將此引數賦值給AO,且值為undefined。如果沒有,則不做任何操作。
2:函式區域性變數,如果AO上有同名的值,則不做任何操作。如果沒有,則將此變數賦值給AO,並且值為undefined。
3:函式宣告,如果AO上有,則會將AO上的物件覆蓋。如果沒有,則不做任何操作。

函式內部無論是使用引數還是使用區域性變數都到AO上找。

看兩個例子:

var age = 18;
function foo(){
  console.log(age);
  var age 
= 22; console.log(age); } foo(); // 問:執行foo()之後的結果是?
var age = 18;
function foo(){
  console.log(age);
  var age = 22;
  console.log(age);
  function age(){
    console.log("呵呵");
  }
  console.log(age);
}
foo();  // 執行後的結果是?
詞法分析過程:
1、分析引數,有一個引數,形成一個 AO.age=undefine;
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 ,所以在第二個輸出的是 2 3、同理第三個輸出的還是22, 因為中間再沒有改變age值的語句了
答案解析