先来通过一个demo来引出js预编译过程
function aoTest(a, b) {
console.log(a)
var a = 123
function a() {
}
console.log(b)
var b = 234
console.log(b)
function b() {
}
console.log(a)
var b = function() {
}
console.log(b)
}
aoTest(1)
输出结果
1.创建一个AO(Active Object)空对象
AO = {}
2.找到变量,赋值undefined
AO = {
a: undefined,
b: undefined
}
3.形参赋值
AO = {
a: 1,
b: undefined
}
4. 函数定义赋值
AO = {
a: function a() {},
b: function b() {}
}
/* 最后执行函数aoTest */
// console.log(a)
ƒ a() {
}
// console.log(b)
ƒ b() {
}
// console.log(b)
234
// console.log(a)
123
// console.log(b)
ƒ () {
}
词法分析过程
- 计算机在执行函数的前一刻会创建一个AO对象
- 第二步将所有的形参和变量声明储存到AO对象中,value为undefined
- 第三步将形参和实参进行统一
- 第四步将所有函数声明的函数名作为AO对象的key,函数整体内容作为value,存储到AO对象中
- 最后顺序执行函数
PS:函数执行时,会先在当前作用域内找变量声明,如果AO中有该变量,则取当前值,否则,会往原型链上依次寻找,直到找到,若未找到,则输出undefined。
GO(Global Object)对象
就是全局对象,即window