JS高级 词法分析详解

2013-12-30 15:24:30


语法分析:

  • 先分析参数;
  • 在分析变量声明;
  • 分析函数声明;

Q: 如何分析变量声明?
A: 对于var 声明的变量, 以var str = 'aseoe'为例, 分为分析过程 和 执行过程.
① 先分析, 后执行.
②先分析  var str;     ,即仅仅声明一个str变量,str变量此时,没有赋值,值是undefined
③然后再进行 执行过程.
  1. var str = 'global';
  2.     function t() {
  3. /*
  4. alert(str);   // undefined
  5. var str = 'aseoe';
  6. alert(str);   // aseoe
  7. */
  8.  
  9.         ///  词法分析
  10.         var str;
  11.  
  12.         // 执行语句
  13.         alert(str);
  14.         str = 'aseoe';
  15.         alert(str;);
  16.  
  17.     }
  18.  
  19.     t();
复制代码
具体步骤:
   Ⅰ:在函数运行前的一瞬间,生成Active Object(活动对象),下称AO;
    Ⅱ:把声明的参数,形成AO的属性,值全是undefined;
    Ⅲ:分析变量声明! 如var age
          如果AO上还没有age属性,则添加AO属性,值全是undefined
          如果AO上已有age属性,则不做任何影响

    Ⅳ:分析函数声明, 如function foo(){},
            则把函数赋给AO.foo属性
   注: 如果此前foo属性已经存在,则被覆盖
  1. function t(age){
  2.       alert(age);
  3. }
  4.     t(6);   //6 
  5.     t();   //undefined
  6. /* 词法分析过程:
  7. AO  {age:undefined}
  8.  
  9.   运行过程:
  10.   t(6)  --> AO.age = 6; alert(AO.age)    //6
  11.  
  12.   t() ---> AO.age没得到赋值,还是 undefined
  13. */
复制代码
分析函数声明

  1. function u(){
  2.    var greet = 'hello';
  3.    alert(greet);
  4.  
  5.    function  greet(){
  6.   }
  7.    alert(greet);
  8. }
  9. u(null);     // hello    hello
  10. /*
  11. 词法分析过程:
  12. 0: AO = {}
  13. 1:
  14.    1.1 分析参数 AO = {greet:undefined}
  15.    1.2 分析参数 AO = {greet:null}
  16. 2: 分析greet 变量声明,AO已经有greet 属性,因此不做任何影响
  17. 3:分析greet函数声明, AO.greet = function (){},被覆盖成函数
  18.  
  19. 执行过程:
  20. greet = 'hello';
  21. alert(greet);
  22. alert(greet);
复制代码
转自:爱思社区 -> JS高级 词法分析详解

为您推荐