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

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

 

1、

jquery方式给var变量 赋脚标 js var变量提升_作用域

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

    

jquery方式给var变量 赋脚标 js var变量提升_作用域_02

输出结果为9;2  

jquery方式给var变量 赋脚标 js var变量提升_作用域_03

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

  

jquery方式给var变量 赋脚标 js var变量提升_jquery方式给var变量 赋脚标_04

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

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

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

      1、

jquery方式给var变量 赋脚标 js var变量提升_作用域_05

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

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

     

jquery方式给var变量 赋脚标 js var变量提升_jquery方式给var变量 赋脚标_06

  最后的输出结果为9;

2、

    

jquery方式给var变量 赋脚标 js var变量提升_全局变量_07

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

3、

   

jquery方式给var变量 赋脚标 js var变量提升_全局变量_08

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

  

jquery方式给var变量 赋脚标 js var变量提升_jquery方式给var变量 赋脚标_09

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

4、

   

jquery方式给var变量 赋脚标 js var变量提升_作用域_10

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

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

   

jquery方式给var变量 赋脚标 js var变量提升_作用域_11

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

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

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