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.函数表达式在执行阶段操作