JavaScript词法分析

   程序的运行分为编译和执行两个步骤,JavaScript属于编译型语言就是先将代码编译一遍再执行,在编译阶段就涉及到词法分析。以函数为例分析,一个函数在编译时首先在作用域链中会产生一个全局对象,该全局对象中包括所有全局变量,比如this,window,document,函数本身的名字等,然后编译到函数调用部分会产生一个活动对象,该对象中包括所有所有局部变量、命名参数(形参)、参数集合(arguments)以及this,当执行阶段函数调用结束该活动对象也会被销毁。下面以一个具体函数分析一下编译的过程

  

function bar(age) {

        console.log(age);
        var age = 99;
        var sex="male";
        console.log(age);
        function age(){
            alert(123);
        } ;
        console.log(age);
        return 100;
}

result=bar(5);

  上面的函数的编译过程是这样的,首先形参age会生成一个活动对象的参数AO.age,因为没有赋值传值操作所以AO.age=undefined,然后函数被调用传入参数5,这时AO.age=5,函数内部定义了局部变量age,发现有多动对象的参数

AO.age所以不做处理否则age=undefined,函数还定义了局部变量sex,此时AO.sex=undefined,最后发现内部定义了函数age,此时AO.age=function age () {...},编译阶段结束。开始执行函数,输出age因为此时AO.age=function age () {}

所以输出的是函数,然后AO.age被赋值为99且之后没有赋值操作了所以后面的两个都是输出99,然后AO.sex被赋值为male,最后把100返回出去。

   总体来说,程序的编译阶段就是在内存中准备好需要的变量,执行阶段就是给这些变量赋值以及其他操作。

posted @ 2017-10-11 15:19  魅力宁波  阅读(132)  评论(0)    收藏  举报