js詞法分析


在函數運行時, 會先進行詞法分析(預編譯) 預編譯做哪些工作?

1:分析參數

2:分析變量聲明

3:分析函數聲明

如何分析變量聲明?

答:對於var 聲明的變量, 以var str = 'local'為例, 分為分析過程 和 執行過程.

先分析, 后執行.

先分析  var str;     ,即僅僅聲明一個str變量,str變量此時,沒有賦值,值是undefined

然后再進行 執行過程.

var str = 'global';
    function t() {
        /*
        alert(str); // undefined
        var str = 'local';
        alert(str); // local
        */



        ///  詞法分析
        var str;

        // 執行語句
        alert(str);
        str = 'local';
        alert(str;);

    }

    t();

 

  活動對象/激活對象, Active Object  

  函數的變量 有其作用域,  

即, 引用某變量時,在某個范圍內查詢該變量,   這個范圍,又在哪兒?

  在AO上找

  在函數調用的瞬間,會產生一個AO,   這個AO對象,的屬性, 即存儲着該函數所能引用到的變量.

function fn1(age,hei) {
    var age;
    alert(age); // 32
    alert(hei); // undefined
}

fn1(32);
function fn1(age,hei) {
    var age;
    alert(age);
    function age() {
        alert('hehe');
    }
}

fn1(32);

/*
//詞法分析過程
AO:{}
AO:{age:undefined,hei:undefined}
AO:{age:32,hei:undefined}
AO:{age:function(){alert('hehe')},hei:undefined}

// 執行:
alert(age); --->AO.age--->函數
*/
 function t(age) {
        alert(age);  // 99
        var age = 12;
        alert(age);  // 12
    }

    t(99);

   AO:{age:undefined}   // 詞法分析形參得到
   AO:{age:99}         // 實參賦值 AO.age屬性
   AO:{age:12}         // 修改AO.age的值
function a(b) {
   alert(b);  // function b(){}
   function b(){
        alert (b);  // 
    }
    b();
}

a(1);

/*
//詞法分析過程
a:AO:{}
a:AO:{b:undefined}
a:AO:{b:function}

b:AO {}
b:AO.b --->{}--->a:AO


// 執行:
alert(age); --->AO.age--->函數
*/
// 函數聲明 與函數表達式


    // 函數表達式
    function fn1(age,hei) {
        alert(age);   
        
        var age = function () {
            alert('hehe');
        }

        alert(age); 
    }
    
    // undefined, function
    // function,function
    // 32, function (正確)

    fn1(32);


    // 函數聲明
    function fn1(age,hei) {
        alert(age);   
        
        function age () {
            alert('hehe');
        }

        alert(age); 
    }
    
    // undefined, function
    // function,function (正確)
    // 32, function

    fn1(32);

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM