在js代码运行之前,会把var和function关键字的优先申明,即可理解为变量的提升。

一、对于关键字var申明的变量的提升

 

1、

这个代码中,var 申明的变量num即在代码最上方,可以这样理解

     输出结果为9;

2  

代码中变量的申明实在输出语句下方,这个时候预解析机制便会将var申明的变量给提升到这个代码的最上方,即:

  

       所以在输出语句时对于变量num并没有赋值,所以输出结果为undefind;

总结:在var 申明的变量中,其变量提升的只是var 神明的变量,而变量之后的赋值并没有提升;

二、对于function申明的变量的提升

      1、

   对于函数来说,在你申明完这个函数之后他的作用域便已经固定了,在函数内部的变量声明他会现在内部寻找是否有需要提升的变量,找到了机会停止寻找,

  并将这个变量提升到这个函数的作用域的最开头,即:

     

  最后的输出结果为9;

2、

    

  对于这个函数来说,他会在函数内部将var申明的变量提升,原理等同于第一个,都是在内部寻找可提升的变量。

3、

   

  在这种情况下,即可认为是

  

   是函数内部的变量提升,即输出的是10.

4、

   

 对于这种情况下,再函数体内其没有var定义的num,所以与解析时会向它的上一级的定义域去寻找被定义的num值,但是他也没有找到,所以其就在

全局变量中定义了一个var变量;等同于这种情况:

   

所以其实有输出的。结果为10;

总结:在全局变量的提升中,预解析过程他会首先在函数体内寻找有没有被var定义的变量,如果有它会将这个变量提升到函数体的最上部,若是没有,他会继续向上一级的作用域寻找,知道找到为止,

 若是到最后都没有找到,就会在全局变量中自定义一个var变。

 

posted on 2019-08-23 14:29  你个磨人的小妖精  阅读(295)  评论(3编辑  收藏  举报