预编译基础栗子

198 阅读1分钟

预编译

简单来说

函数声明整体提升

变量 声明提升

深入解说

  1. 预编译前奏 :

    1. 任何变量,如果未经声明就赋值的变量, 此变量为全局对象所有 (暗示全局变量)
    2. 一切声明的全局变量,全是window的属性 var a = 123; ==> window.a = 123;
  2. 预编译 :

    1. 创建AO(Activation Object)(执行期上下文) AO{}
    2. 找形参和变量声明,将变量和形参名作为AO 的属性名,值为undefined AO{ a:undefined, b:undefined }
    3. 将实参和形参统一 AO{ a:1, b:undefined }
    4. 在函数体里面找函数声明,值赋予函数体 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);