JavaScript之词法分析
Sep 12, 2014
js是一门简单的严格面向对象语言,对于刚开始学习js的菜鸟来说,要想学好js有两条链是必须要掌握的,它们分别是:
- 作用域链
- 面向对象原型链
这里简单总结下有关作用域链的问题,首先要求我们得懂的js的词法分析,关于词法分析分为两部分来思考,分别是分析阶段和执行阶段。
###分析阶段
在分析阶段,我们要懂得依次分析三样东西,他们分别是:
- 先分析所传递参数
- 再分析变量声明
- 最后分析函数声明
一个函数能使用的局部变量,就是从上面三步分析得来的,而对于全局变量,我们就得沿着作用域链自下而上寻找了。
具体步骤:(注意:步骤是依次执行的)
函数运行前的一瞬间,会生成Active Object(活动对象),简称AO。
分析传递参数
- 函数声明的参数,形成AO的属性,值全是undefined
- 接收实参,形成AO相应属性的值
分析var变量声明,如:
var age
- 如果AO上还没有age属性,则值是undefined
- 如果AO上已经存在age属性,则不做任何影响
分析函数声明,如
function foo () {}
- 则把函数赋给AO.foo属性
- 如果此前foo属性已经存在,则被无情的覆盖
###执行阶段
最后分析执行过程,比如:变量的赋值操作、打印输出等
注意: 函数表达式也是一个赋值过程,在此阶段执行,特此注意!
下面简单分析几个案例:
案例一:
function test1 (age) {
var age = 20;
alert(age);
}
test1();
1、分析过程:
- 形成
AO={}
- 分析形参,
AO={age:undefined}
- 分析
var age
,发现AO已有age属性,不做任何影响
2、执行过程
AO.age=20
alert(age)
案例二:
function test2 (a) {
var a = 'hello';
alert(a);
function a () {}
alert(a);
}
test2();
1、分析过程:
AO={}
- 分析参数,
AO={a:undefined}
- 分析变量声明,AO已有a属性,因次不做任何影响。
- 分析函数声明,
AO.a=function(){}
,即a属性被覆盖成函数
2、执行过程
a=hello
alert(a);
alert(a);
案例三:
function a (b) {
alert(b);
function b () {
alert(b);
}
b();
}
a(1);
1、分析过程
- 形成
AO={}
- 分析参数,
AO={b:undefined}
,接受实参,形成AO={b:1}
- 分析变量声明,无var变量声明
- 分析函数声明,
AO.b=function (){}
2、执行过程
alert(b)
b()
,然后alert(b)
###小结
懂得js的词法分析还是很有必要的,这样会很清除函数的执行过程以及原理。以后遇到类似的问题或者面试题,只要严格按照上述的步骤进行推导,就会得出正确的答案!~~
(end)