Javascript词法分析

词法分析的过程:

  1. 先分析参数
  2. 分析变量声明
  3. 分析函数声明

具体步骤:

  1. 在函数运行前的一瞬间,先生成Active Object活动对象;
  2. 函数声明的参数,形成AO的属性,值为undefined
  3. 接收参数(实参),形成AO相应属性的值
  4. 分析变量的声明,如 var age,

c-1. 如果AO还没有age属性,则添加AO的age属性,值是undefined

c-2. 如果AO已经有了age属性,则不作任何影响

5. 分析函数声明,如function foo(){},则吧函数付给AO.foo属性,如果此前foo属性已存在,则被无情的覆盖了。

举例:

function t(greet){
        var greet = 'hello';
        alert(greet);
    
        function greet(){}
    
        alert(greet);
    }

    t(3);

解析:

一. 词法分析过程

  1. 生成AO={};
  2. 分析函数的参数greet, AO={greet:undefinde}
  3. 接收实参,AO = {greet:3}
  4. 有变量声明,但是由于AO已经有了greet属性,所以不受任何影响,AO = {greet : 3}(注意:声明仅仅是 var greet,而greet = ‘hello’是赋值,在执行阶段被执行。)
  5. 有函数声明,生成AO.greet = function(){};

二. 语句执行过程

  1. 执行greet = 'hello';
  2. Alert(greet);
  3. Alert(greet);

所以本题弹出两个hello.

思考题:

function a(b){
        Var b;
        alert(b);
        function b(){
            alert(b);
        }
        b();
    }

    a(1);

解析:

一、词法分析过程

  1. 生成AO={}
  2. 分析参数b,AO={b:undefined}
  3. 接收实参,AO = {b:1}
  4. 分析变量声明,而由于AO已经有了greet属性,所以不做影响。AO = {b:1}
  5. 分析函数声明,AO= {b:function(){aler(b)}}

二、函数执行过程

  1. 执行alert(b);
  2. 执行b();也是alert(b);

这种所以本题应该alert两次function(){alert(b)}

clip_image002

posted on 2014-03-19 21:04  大别针儿  阅读(211)  评论(0)    收藏  举报