js中的词法分析:当js中的函数执行时,先分析后执行。

1.词法分析要做几件事??
  1).分析参数
  2).分析变量
  3).分析函数
         分析顺序如上。


2.如何分析变量声明

如var str='xin'这个语句是先分析 声明var str 此时值是undefine
 

这个语句等价于:
  function test(){
    var str;
   alert(str);//此时值是undefine
   str='xin';//然后给str变量赋值
   alert(str);//此时值是xin 
  }


3.看看例子,考考自己:
 3.1 
  function test(age){
   alert (age);
   var age=12;
   alert(age);
  }
  test(99);
 问题:现在打印什么??
  99     12
      解答:由于js中的要进行词法分析,首先分析参数,然后是变量,最后是函数
     所以age的值变换为  undifine=====>99 ====>12
 大家答对了吗???如果没有答对,就继续向上下看,我会再后面给大家写出答案的解析。


4.为大家解释3.1的原理
 要想弄懂这个,就要了解js中的活动对象(Active Object)的概念
 函数的变量,有其作用域
 而这个作用域又在哪,??在AO上,也就是活动对象。
 
5.AO(活动对象Active Object)的介绍。
 在函数的调用瞬间时会产生一个AO对象,这个AO对象的属性,即存储着它的变量

6.现在我们一起来看上面3.1的事例吧!!!
 
 
  function test(age){
   alert (age);
   var age=12;
   alert(age);
  }
  test(99);

  当我们调用test函数时,就在这一瞬间,产生了一个Active Object (活动对象简称AO),即然他是一

         个对象,那么它就应该有属性,这个属性来自于3个地方(即接收参数,变量声明,分析方法)
  上例可变形为:
   AO.age=undifine;
   AO.age=99;
   //所以第一次打印时是99
   而 var age=12;在AO对象已经有这个属性了,就不会再次词法分析了
   故只是现有AO对象的age属性赋值的过程
   AO.age=12;//等同于var age=12;
   //所以第二次打印时是12;

7.词法分析与作用域链。
 如果函数嵌套时,每个函数都会再自己被调用时,产生自己的AO,这时,如果调用的方法中没有
 属性值,那么,就像外层找,一层一层的找,直到找到window对象。


8.详细说明Active Object对象。
 8.1看看下面的例子.
 function test(number){
  alert(number);
 }
 test(2);
 分析上面这个例子:
     第一步:分析,这属于词法分析里的哪种分析
     答:参数分析

     第二步:当test(2);这句话调用test()函数时,
       发生了什么。
                    答:产生了一个AO,并先进行参数分析,A0.number=undifine
         在这个函数的运行中,A0.number又被赋了新值A0.number=2
    第三步:结论  答案是32;

 8.2再来看看这个例子:
 function test2(number,age){
  alert(number);//9
  alert(age);//undifine
 }
 test2(9);
 这次你明白了吗??如果没太懂也没有关系,第一个number打印出9大家是明白的,但是age是undifine就不懂

了,是吧,这是因为 test2(9);当调用的一瞬间,AO的变化是这样的:
      第一步:  
       AO.number=undifine;
       AO.age=undifine;
      第二步将传入的参数赋值,
       AO.number=9;
      而注意看AO.age是不是还是undifine,这下明白了吧。

 8.3最后看一个吧!!
  function a(b){
  alert(b);
  function b(){
   alert(b);
  } 
    b();
 }
 a(1);
 这次的运行结果是什么??是两个function b(){alert(b)},你答对了吗???