js预编译

84 阅读1分钟
     function fn(a, c) {
        console.log(a);
        var a = 123;
        console.log(a);
        console.log(c);
        function a() {}
        if (false) {
            var d = 678;
        }
        console.log(d);
        console.log(b);
        var b = function () {};
        console.log(b);
        function c() {}
        console.log(c);
    }
    fn(1, 2);

js执行时会经历预编译阶段

预编译步骤:

  1. 创建AO对象,供js内部访问
  2. 找形参和变量声明 作为AO对象的属性,值为undefined
  3. 形参和实参相统一
  4. 找函数声明 会覆盖变量的声明

第一步:创建AO对象

let AO = {};

第二步:找形参和变量声明 作为AO对象的属性,值为undefined

AO = {
    a: undefined, //形参
    c: undefined, //形参
    d: undefined, //变量声明
    b: undefined, //变量声明
};

第三步:形参和实参相统一

 AO = {
    a: 1,
    c: 2,
    d: undefined,
    b: undefined,
};

第四步:函数声明覆盖变量声明

AO = {
    a: function a() {},
    c: function c() {},
    d: undefined,
    b: undefined,
};

至此 预编译阶段结束 开始逐行执行js

console.log(a); // 预编译阶段 function a() {}
var a = 123;
console.log(a); // 123
console.log(c); // 预编译阶段 function c() {}
function a() {}
if (false) {
    var d = 678;
}
console.log(d); // undefined
console.log(b); // undefined
var b = function () {};
console.log(b); // function () {}
function c() {}
console.log(c); // function c() {}