执行下列程序,输出结果为 2
var a = 1;
function fn(){
var a = 2;
function a(){console.log(3);}
return a;
function a(){console.log(4);}
}
var b = fn();
console.log(b);
输出的b值为函数fn内的变量a,
在函数fn内部,由于存在变量提升和函数提升,且函数提升会在变量提升之前,
因此变量a会先被赋值为函数f a(){console.log(3);},之后被重新赋值为函数f a(){console.log(4);},最后被赋值为2,所以b值为2
当变量名和函数名相同时,如果变量声明并且赋了值。变量会覆盖函数。反之,声明了没赋值,函数覆盖变量
优先变量提升,然后函数赋值大于形参赋值大于变量赋值。
函数fn预解析一下
这道题没有形参赋值。
函数fn()的执行过程相当于:
function fn(){
var a ;//此处变量提升 变量名和函数名都是a 提升到当前作用域的最顶端
a=function (){console.log(3);} //接着函数赋值
a= function (){console.log(4);} //函数赋值
a=2; //最后变量赋值
return a;
}
**函数声明的优先级高于变量声明的优先级,用var声明的变量存在变量提升。函数赋值大于形参赋值大于变量赋值。 **