javaScript的面试重点--预解析
一.前言
关于预解析,我们通过今天学习就能够知道解析器运行JS分为哪两步;能够说出变量提升的步骤和运行过程;能够说出函数提升的步骤和运行过程。
二.预解析案例
预解析,简而言之,也就是javaScrIPt解析器在运行javaScrIPt代码的时候所进行的第一步。第二步则就是执行代码,按照代码书写的顺序从上往下执行。
在预解析过程中,JS引擎会把JS里面所有的var还有function提升到当前作用域的最前面。其中预解析又可以分为变量预解析(变量提升)和函数预解析(函数提升)。
在我们声明赋值num1变量的前面,就执行了输出num1的表达式,这样的结果会是什么呢?
我们来看下执行结果:
通过运行编译我们会发现我们的执行结果是undefined,为什么会是这样的结果呢?
这就是我们预解析的神奇之处,下面我们来分析下这个预解析的详细过程。
因为上面那个案例有变量的声明,根据我们的变量预解析,再将变量提升之后,实际上执行的代码如下:
到这里我们就可以知道,变量提升就是把所有的变量声明提升到当前作用域的最前面,但不提升赋值操作。因此这里我们的num1在声明之后,由于没有赋值,所以得到的结果自然也就是undefined了。
下面我们再来看看函数的预解析:
结果可能出乎大家的意料哦,现在让我们来看下结果:
我们可以发现最后的结果是输出5个7,跟最后一个未定义的报错提示。
现在我们来分析下结果,由于我们用var声明多个变量的格式为:
var a=7,b=7,c=7中间只需用逗号隔开就可以了,而案例中的声明其实是这样的结果:
在函数中,没有使用var声明的变量就会从局部变量转为全局变量,也就是说,案例中的b和c此刻都变成了全局变量。
因此我们在执行fn()这个函数的时候,就会把a,b,c的值都输出出来,也就是3个7。再执行b和c的输出,就把剩下的2个7给输出来。由于a使用了var声明,因此我们的a依然是fn函数里面的局部变量。因此最后的结果自然就是undefined啦。
最后,函数的提升也就是把所有的函数声明提升到当前作用域的最前面,但不调用函数。
Ongwu博客 版权声明:以上内容未经允许不得转载!授权事宜或对内容有异议或投诉,请联系站长,将尽快回复您,谢谢合作!