词法分析步骤

概念

词法分析:

一个函数能使用的局部变量,就从下面面的三步分析而来。
第一步:先分析参数
第二步:再分析变量声明
第三步:再分析函数声明

具体步骤:
0:

函数运行前的一瞬间,生成Active Object(活动对象),下称AO

1:

1.1 函数声明的参数形成AO的属性,值全是undefined
1.2 接收实参,形成AO相应属性的值。

2:

分析变量声明声明声明,var age;
如果AO上还没有age属性,则添加AO属性,值是undefined
如果AO上已有age属性,则不做任何变化。

3:

分析函数声明,如:function foo(){}
则把函数赋给AO.foo属性
注:如果此前有foo属性,则会被无情的覆盖。

示例1

function t2(age){
    var age = 99;
    alert(age);
}
t2();

分析过程:
0:形成AO = {}
1:

1.1分析形参AO{age:undefined}
1.2接收实参AO{age:undefined}

2: 分析变量声明,发现AO上已有age属性,不做任何变化。

执行过程:
AO.age = 99;
alert(age);//99

示列2

// 这题要仔细分析哦
function t3(greet){
   var greet='hello';
   alert(greet);
   function greet(){}
   alert(greet);
}
t3(null);

词法分析:
0:形成AO = {}
1:

1.1分析形参 AO = {greet:undefined}
1.2接收实参AO{greet:null}

2: 分析变量声明,发现AO上已有greet属性,不做任何变化。
3: 分析函数声明,被无情覆盖,所以AO = {greet:function greet(){}}

执行过程:
greet = ‘hello’;
alert(greet);
alert(greet);
结果当然是alert出来两个hello。

示例3

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

词法分析:
0:形成AO = {}
1:

1.1 分析形参 AO = {b:undefined}
1.2 接收实参 AO = {b:1}

2: 分析变量声明,没有变量声明
3:分析函数声明,之前的AO.b属性全部被无情覆盖,AO = {b:function b(){}}

执行过程:
alert(b);
b(); //由作用域寻找到a函数中的b,即function,然后alert出来。

留个作业

思考:如果把上面的代码修改后,如下,结果又是如何?

function a(b){
   alert(b);
   b=function(){
       alert(b);
   }
   b();
}
a(1);

欢迎留言提交答案

你可能感兴趣的:(#,JavaScript,词法分析)