在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变。