执行下列程序,输出结果为 2

发布时间 2023-11-05 23:47:36作者: 龙陌

执行下列程序,输出结果为 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声明的变量存在变量提升。函数赋值大于形参赋值大于变量赋值。 **