Js中的提升

Js的执行并不是由上向下一行一行顺序下来的,一个例子如下:

   

a = 2;

      var a ;

      console.log(a)   //2

输出的是2,这区别于别的语言。 

再一个例子:

     

console.log(a);  //undefined

     var a = 2;

输出的是undefined

     

     由var a  = 2;

     Js的引擎机制是先编译,再执 ,先从编译器说起,编译过程中,我们知道编译会先根据声明为其确定作用域。上面的例子中实际上编译器会将其看成两个声明,分别为var a;a =2。因为事先需要确定作用域,所以var a;在编译过程中就已经执行,而赋值操作a =2;就会留在原地等待正常顺序的执行。所以上面的两个例子可以看成如下:

     

第一个:

     var a;

     a = 2;

     console.log(a);

     第二个:

     var a;

     console.log(a);

     a  = 2;

上面的这种提前声明则被称作为提升。提升在每个作用域中都存在,如下:

    

 var a;

     function foo(){

        b = 2;

        console.log(b);   //2

        var b;

}

可以理解为如下:   

var a;

     function foo(){

        var b;

        b = 2;

        console.log(b);   //2

}

 

     另外假如重复声明的话,后面的声明会覆盖前面的声明,函数声明会覆盖变量声明。如下:

    foo(); //3

     function foo(){

         console.log(2)

};

     function foo(){

        console.log(3)

};

后面的声明覆盖了前面。

    

 foo();  // 2

     function foo(){

       console.log(2);

};

    var foo;

函数声明覆盖了变量声明。

    

   

       由于Js特别的机制,书写过程中应该尽量避免重复声明。

  

原文地址:https://www.cnblogs.com/Darlietoothpaste/p/6349714.html