第一步: 检查语法错误
浏览器或者node环境将所有JS检查一遍,检查是否有语法错误,注意并不会执行,这里是确保可执行,然后进行第二步:预编译
第二步:预编译
预备知识:变量提升
首先要理解函数声明整体提升,变量 声明提升。这里要注意变量的提升,一般我们声明一个变量都是
var a = 1;
console.log(a) //1
//但实际上拆分成了两步,真正执行是这样的
var a; // 这一步会提升到执行环境顶部
a = 1;
console.log(a) //1
如果将console.log放a前面会打印出undefined
console.log(a) //undefined
var a = 1;
// 实际上函数会按照下面步骤执行
// 因为变量的声明提升了,但是赋值并没有提升
var a;
console.log(a); // 这里a已经定义了,但没有赋值
a = 1;
预编译步骤:
1、预编译的时候会创建一个AO对象(Activation Object)执行上下文;
2、找形参和变量声明,将形参和变量作为AO对象的属性名,值为undefined;
3、将形参和实参统一;
4、在函数体里找函数声明,值赋给函数体
注意: AO按如下顺序填充:
- 函数参数(若有传参, 会被赋值, 若未传参, 初始化值为undefined) 优先级