预编译
简单来说
函数声明整体提升
变量 声明提升
深入解说
-
预编译前奏 :
- 任何变量,如果未经声明就赋值的变量, 此变量为全局对象所有 (暗示全局变量)
- 一切声明的全局变量,全是window的属性 var a = 123; ==> window.a = 123;
-
预编译 :
- 创建AO(Activation Object)(执行期上下文) AO{}
- 找形参和变量声明,将变量和形参名作为AO 的属性名,值为undefined AO{ a:undefined, b:undefined }
- 将实参和形参统一 AO{ a:1, b:undefined }
- 在函数体里面找函数声明,值赋予函数体 AO{ a:function a(){}, b:undefined, d:function d(){} }
全局预编译,生成一个GO对象(Global Object)
例子:
AO:{
a: function a(){}
b: undefined
d: function d(){}
}
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a(){}
console.log(a);
var b = function(){}
console.log(b);
function d(){}
}
fn(1);