词法分析步骤
词法分析:
一个函数能使用的局部变量,就从下面面的三步分析而来。
第一步:先分析参数
第二步:再分析变量声明
第三步:再分析函数声明
具体步骤:
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);
【欢迎留言提交答案】