变量提升与函数提升

在JavaScript中,变量的定义和函数的定义都会被提升,而且函数的声明优先于变量的声明;在变量中,变量的赋值不会被提升,只是声明被提升了,但是函数的声明有点不一样,如果是函数式声明则函数体也会被一同提升,如果是var式的声明,怎么提升声明,不会提升函数体。

例子:

   var a=3;
   function b(){
      if(a){
         var a=1;
      }else{
         var a=0;
      }
      console.log(a);
   }
   b();//控制台输出:0;此时输出的a是b函数里面的私有变量。

浏览器解析:

   function b(){
      var a;
      if(a){
         a=1;
      }else{
         a=0;
      }
      console.log(a);
   }
   var a;
   a=3;
   b();//控制台输出:0;此时输出的a是b函数里面的私有变量。

例子:

 var a=1;
   function b(){
      a=10;
      return;
      function a(){};
   }
   b();
   console.log(a);//控制台输出:1;此时输出的a是全局变量。

浏览器解析:

   function b(){
      function a(){};//函数提升,声明局部函数a;
      a=10;//将函数a强制进行类型转换为number,并赋值为10;此时的a是局部变量;
      return;      
   }
   var a;
   a=1;  
   b();//函数b的返回结果为undefined,因为在函数体里面,没有return任何东西;  
   console.log(a);//控制台输出:1;此时输出的a是全局变量。

例子:

   a();//控制台报错,因为被提升的只是a的声明,而赋值的函数体却没有没提升,所以报错信息显示a不是一个函数;
   b();//控制台输出this is b funciton! ;函数b可以被提升;
    var a=function(){
      console.log('this is a function!');
   }
   function b(){
      console.log('this is b function!');
   } 

浏览器解析:

   function b(){
      console.log('this is b function!');
   }  
   var a;
   a();//控制台报错,因为被提升的只是a的声明,而赋值的函数体却没有没提升,所以报错信息显示a不是一个函数;
   b();//控制台输出this is b funciton! ;函数b可以被提升;
   a=function(){
      console.log('this is a function!');
   } 

对于全局作用域范围的变量,var与没有var是有区别的,没有var的写法,其变量不会被提升。eval里面的变量也不会被提升;

例子:

   console.log(a);//控制台报错,a未定义;a变量没有被提升;
   a=1;
   console.log(b);//控制台输出undefined;b未赋值;b变量得到提升;
   var b=1;
   function b(){
      console.log(a);//控制台输出undefined;a声明得到提升;
      var a=10;  
   }
   function d(){
      console.log(c);//控制台报错,变量c没有定义;c声明没有得到提升;
      eval("var c=10");
   }
   b();
   d();

 

posted @ 2020-03-20 23:52  sjzhen  阅读(172)  评论(0编辑  收藏  举报