JavaScript词法分析

在函数运行时, 会先进行词法分析(预编译) 预编译做哪些工作?

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);
复制代码
原文地址:https://www.cnblogs.com/axl234/p/5519199.html