Javascript 詞法分析

Javascript 詞法分析

詞法分析

分析3樣東西
第一步:先分析參數
第二步:再分析變量聲明
第三部:分析函數聲明

一個函數能適用的全局變量,就從上面的3步分析而來

具體步驟:

0:函數運行前的一瞬間,生成Aactive Object (活動對象),叫AO
1:
1.1 函數聲明的參數,造成AO的屬性,值全是undefined
1.2 接收實參,造成AO相應的屬性的值

2:分析變量聲明!如var age,
若是AO上尚未age屬性,則添加A0屬性,值是undefined
若是AO上已經有age屬性,則不作任何影響

3:分析函數聲明,如function foo(){},
則把函數賦給AO.foo屬性
注:若是此前foo屬性已存在,則被無情的覆蓋了
 
實例一
function t(age) {
    alert(age)
}

t(5) //5
t() //undefined
詞法分析過程:
AO {age:undefined}

運行過程:
t(5) ->AO.age=5;alert(AO.age);//5

t() ->AO.age沒有獲得賦值,仍是undefined

  實例二
function t2(age){
    var age = 99;
    alert(age)
}
t2();
分析過程

0:造成AO={}
1:
1.1 分析形參 AO = {age:undefined}
1.2 接收形參 AO = {age:5}

2:分析var age,發現AO已經有age屬性,不作任何影響

執行過程
AO.age = 99;
alert(age)
 
  實例三
function t3(greet){
    var greet = 'hello';
    alert(greet);

    function greet(){}

    alert(greet)
}

t3(null); //hello hello
詞法分析過程:
0:AO = {}
1:
1.1 分析參數 AO = {greet:undefined}
1.2 分析參數 AO = {green:null}
2:分析green變量聲明,A0已經有greet屬性,所以不作任何影響
3:分析green函數聲明,AO.greet = function(){},被覆蓋成函數

執行過程:
green = 'hello'
alert(greet)
alet(greet)
 
實例四
function a(b){
    alert(b);
    b = function(){
        alert(b)
    }
    b();
}
a(1);
詞法分析過程
0:A0 = {}
1:分析形參 A0 = {b:undefined} -> {b:1}
2:分析var聲明沒有?沒有
3:分析函數聲明沒有?沒有
(注:b = function({}) ,是一個賦值過程,在執行期過程纔有用)

執行過程:
alert(b);//1
b = function(){
alert(b);
}
b();//function
 
函數聲明與賦值函數的區別
 
function t1(){}
t2 = function(){}
這兩種方式效果不一樣
t1是函數聲明,雖然全局內也獲得一個t1變量,值是function
t2只是一個賦值的過程,值是誰?值是右側表達式的返回結果,即函數
就是說function (){}在js看來,就和3*2,6/3同樣,是個表達式,返回一個結果
所以,t1 t2兩種方式在詞法分析時,有着本質區別
前者,在詞法分析階段,就發揮做用
然後者,在運行階段,才發揮做用
相關文章
相關標籤/搜索