function f(a) { console.log(a); var a = 123; console.log(a); function a() {} console.log(a); var b = function () {} console.log(b); }
f(1);
分析:预编译发生在函数执行的前一刻,分4步,
1.创建AO对象 AO{} 2.找形参和变量声明,放到AO对象中值为undefined AO{ a: undefined, b: undefined } 3.把实参的值传给形参 AO{ a: 1, b: undefined }
4.在函数里找函数声明,并将函数体赋值
AO{ a: a() {}, b: undefined }
结果:
ƒ a() {} //直接打印AO里a的属性值
123 //var a已经提升不会再执行,但是会执行a=123
123 //function a() {}已经提升不会再执行
ƒ () {} //var b已经提升不会再执行,但是会执行b = function () {}