function fn(a){
console.log(a);
var a=123;
console.log(a);
function a(){}
console.log(a);
}
fn(1);
//输出:ƒ a(){}
//输出:123
//输出:123
预编译过程:
- 创建AO对象
- 找形参和变量声明,将形参和变量作为AO的属性值,值为undefined
- 将实参和形参统一
- 在函数体内找函数声明,值为函数体
备注:预编译发生在函数执行的前一刻
记一面试题:
var a=0;
console.log('window.a:'+window.a,'a:'+a,'outer a=0');//输出:window.a:0 a:0 outer a=0
if(true){
a=1;
console.log('window.a:'+window.a,'a:'+a,'inner1 a=1');//输出:window.a:0 a:1 inner1 a=1
function a(){};
console.log('window.a:'+window.a,'a:'+a,'inner2 function');//输出:window.a:1 a:1 inner2 function
a=21;
console.log('window.a:'+window.a,'a:'+a,'inner3 a=21');//输出:window.a:1 a:21 inner3 a=21
}
console.log('window.a:'+window.a,'a:'+a,'outer');
//输出:window.a:1 a:1 outer
此题纠结很久,也找过答案,但是任然不太能理解输出结果。唯一庆幸的是现在if里面是不允许声明函数的。