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