js词法分析

javascript词法分析
函数在运行的瞬间,生成一个活动对象(Active Object),简称AO;
具体分为两个阶段:
一.分析阶段
JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:
 
1.分析参数
2.分析变量声明
3.分析函数声明
二.执行阶段 (即做赋值等操作)
 
具体例子及简单分析步骤如下:
*1.无参数情况*
1 function func() {
2       console.log(age);
3       var age = 25;
4       console.log(age);
5       function age() {
6       }
7       console.log(age);
8   }
9 func();
1.1详细分析步骤
// 分析阶段
形成活动对象AO, 假设 AO = {};
1)分析参数
a.分析形参(没有跳过)
b.分析实参(没有跳过)
2)分析变量声明
a. AO.age = undefined;(在函数分析阶段默认往AO活动对象添加属性值为undefined);
3) 分析函数声明
a. AO.age = function(){};(如果AO中已存在age属性直接做覆盖操作,如果不存在则新建age属性进AO)
// 执行阶段
1.打印 function() {};
2.age赋值25 AO.age = 25;
3.打印 25;
4.打印 25;
 
**//以下例子同上类似步骤简写分析**
*2.有参数情况*
1 function func(age) {
2       console.log(age);
3       var age = 25;
4       console.log(age);
5       function age() {
6       }
7       console.log(age);
8   }
9 func(18);
2.1
// 分析阶段
1)分析参数
a. AO.age = undefined;
b. AO.age = 18;
2)分析变量声明
AO.age = 18; (AO中已存在age属性)
3.分析函数声明
AO.age = function() {};
//执行阶段
1.打印 function() {};
2.赋值后打印 AO.age = 25;
3.打印 25;
 
*3.报错情况*
 1 function func(age) {
 2       var age;
 3      console.log(age);
 4       var age = 25;
 5       console.log(age);
 6       function age() {
 7           console.log(age);
 8       }
 9       age();
10      console.log(age);
11  
12  }
13 func(18);
3.1
// 分析阶段
1.分析参数
a. AO.age = undefined;
b. AO.age = 18;
2.分析变量声明
AO.age = 18;(AO中已存在,保持不变);
3.分析函数声明
AO.age = function() {}; (存在age属性覆盖)
 
//执行阶段
1.打印 function() {};
2.赋值后打印 25;
3. age is not a function;(执行函数时AO的age已经为25)
4. 报错不执行;
 
*4.变量提升情况*
1 var name = "test";
2 function t() {
3     console.log(name);
4     var name = "test1";
5     console.log(name);
6 }
7 t();
类似写法
var name = "test";
function t() {
    var name;
    console.log(name);
    name = "test1";
    console.log(name);
}
t();

4.1

// 分析阶段
1.分析参数(没有参数跳过)
2.分析变量声明
AO.name = undefined;
3.分析函数声明(没有跳过)
 
//执行阶段
1.打印 undefined;
2.赋值后打印 test1;
 
注:
1.函数声明在分析阶段操作
2.函数表达式在执行阶段操作
 

猜你喜欢

转载自www.cnblogs.com/jiaqi1719/p/10019689.html