语法分析:
Q: 如何分析变量声明?
A: 对于var 声明的变量, 以var str = 'aseoe'为例, 分为分析过程 和 执行过程.
① 先分析, 后执行.
②先分析 var str; ,即仅仅声明一个str变量,str变量此时,没有赋值,值是undefined
③然后再进行 执行过程.
- var str = 'global';
- function t() {
- /*
- alert(str); // undefined
- var str = 'aseoe';
- alert(str); // aseoe
- */
-
- /// 词法分析
- var str;
-
- // 执行语句
- alert(str);
- str = 'aseoe';
- alert(str;);
-
- }
-
- t();
复制代码
具体步骤:
Ⅰ:在函数运行前的一瞬间,生成Active Object(活动对象),下称AO;
Ⅱ:把声明的参数,形成AO的属性,值全是undefined;
Ⅲ:分析变量声明! 如var age
如果AO上还没有age属性,则添加AO属性,值全是undefined
如果AO上已有age属性,则不做任何影响
Ⅳ:分析函数声明, 如function foo(){},
则把函数赋给AO.foo属性
注: 如果此前foo属性已经存在,则被覆盖
- function t(age){
- alert(age);
- }
- t(6); //6
- t(); //undefined
- /* 词法分析过程:
- AO {age:undefined}
-
- 运行过程:
- t(6) --> AO.age = 6; alert(AO.age) //6
-
- t() ---> AO.age没得到赋值,还是 undefined
- */
复制代码
分析函数声明
- function u(){
- var greet = 'hello';
- alert(greet);
-
- function greet(){
- }
- alert(greet);
- }
- u(null); // hello hello
- /*
- 词法分析过程:
- 0: AO = {}
- 1:
- 1.1 分析参数 AO = {greet:undefined}
- 1.2 分析参数 AO = {greet:null}
- 2: 分析greet 变量声明,AO已经有greet 属性,因此不做任何影响
- 3:分析greet函数声明, AO.greet = function (){},被覆盖成函数
-
- 执行过程:
- greet = 'hello';
- alert(greet);
- alert(greet);
复制代码
转自:爱思社区 -> JS高级 词法分析详解