预编译发生在函数执行的前一刻
AO
AO发生在函数体里,举例
function fn(a) {
console.log(a);
console.log(b);
a = 123;
console.log(a);
function a(){}// 这是函数声明
var a;
console.log(a);
var b = function (){}// 这个是函数表达式
console.log(b);
}
fn(1);
输出结果:
ƒ a(){}
undefined
123
123
ƒ (){}
为什么是这样的,预编译时分为:
- 创建一个AO对象
- 找形参和变量声明,将形参和变量名作为AO属性名,值为undefined
- 将实参值和形参统一(就是赋值)
- 在函数体里面找函数声明,值赋予函数体
拿a举例
a:undefined—>a:1—>a:function a(){}
函数体提前所以第一个输出function a(){},第二个a已经赋值,输出123,第三个a前面的函数已经提前所以还是123
GO
GO发生在全局,其实GO比AO少了第三部的赋值,其他跟AO一样。