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)},你答对了吗???