javascript预编译详解

javascript运行代码总结下来就是三步

1.分析代码
2.预编译
3.执行语句

分析代码就是对代码排查一些错误

预编译就是在执行代码前对变量,函数等申明

执行语句就是字面意思

那函数预编译执行的过程又是怎么的呢

先看代码

function fn(a) {
    console.log(a)  // function a() {}
    var a = 123
    console.log(a)  // 123
    function a() {}
    console.log(a)  // 123
    var b = function () {}
    console.log(b)  // function () {}
}
fn(1)

函数fn未执行前fn函数内会创建一个AO对象,先对形参和变量申明提升, 之后对形参和实参进行统一(此时a为1),最后函数申明提升(此时a为function(){})

所以执行后,第一个console.log中a是function a(){},第二个console.log中a被赋值了,所以是123,第三个console.log中,因为function a(){}这个一开始是申明提升,所以不会执行,所以a还是为123,最后console.log中b自然是function(){}

总结下来 对函数的预编译就是

1.创建AO对象 Activation Object
2.找到形参和变量申请提升,为undefined
3.实参和形参统一数据
4.函数申明提升

过程详解如下:

1.AO {
   }
2.AO {
        a: undefined,
        b: undefined
   }
3.AO {
        a: 1,
        b: undefined    
   }
4.AO {
        a: function a() {},
        b: undefined
}
5.AO {
        a: 123,
        b: undefined
   }
6.AO {
        a: 123,
        b: function () {}
   }
                       

还有一个除了AO, 还有就是GO对象是全局预编译,它是优先于AO对象所创建和执行的,过程和AO对象一样

end !!!

原文地址:https://www.cnblogs.com/lyjfight/p/13328596.html