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 !!!