当前位置:   article > 正文

javaScript的面试重点--预解析

javaScript的面试重点--预解析

目录

一.前言

二.预解析案例


一.前言

        关于预解析,我们通过今天学习就能够知道解析器运行JS分为哪两步;能够说出变量提升的步骤和运行过程;能够说出函数提升的步骤和运行过程。

二.预解析案例

        预解析,简而言之,也就是javaScript解析器在运行javaScript代码的时候所进行的第一步。第二步则就是执行代码,按照代码书写的顺序从上往下执行。

        在预解析过程中,JS引擎会把JS里面所有的var还有function提升到当前作用域的最前面。其中预解析又可以分为变量预解析(变量提升)和函数预解析(函数提升)。

        下面我们来分析下以下代码的执行结果:

  1. console.log(num1)
  2. var num1=10

       

         在我们声明赋值num1变量的前面,就执行了输出num1的表达式,这样的结果会是什么呢?

我们来看下执行结果:

        

        通过运行编译我们会发现我们的执行结果是undefined,为什么会是这样的结果呢?

       这就是我们预解析的神奇之处,下面我们来分析下这个预解析的详细过程。

        因为上面那个案例有变量的声明,根据我们的变量预解析,再将变量提升之后,实际上执行的代码如下:

        

  1. var num1;
  2. console.log(num1)
  3. num1=10

         

        到这里我们就可以知道,变量提升就是把所有的变量声明提升到当前作用域的最前面,但不提升赋值操作。因此这里我们的num1在声明之后,由于没有赋值,所以得到的结果自然也就是undefined了。

       

        下面我们再来看看函数的预解析:

        首先分析下下面这段代码的执行结果会是什么样的:

        

  1. function fn(){
  2. var a=b=c=7
  3. console.log(a)
  4. console.log(b)
  5. console.log(c)
  6. }
  7. fn()
  8. console.log(c)
  9. console.log(b)
  10. console.log(a)

        结果可能出乎大家的意料哦,现在让我们来看下结果:

        

        我们可以发现最后的结果是输出5个7,跟最后一个未定义的报错提示。

         现在我们来分析下结果,由于我们用var声明多个变量的格式为:

var a=7,b=7,c=7

         中间只需用逗号隔开就可以了,而案例中的声明其实是这样的结果:

  1. var a=7;
  2. b=7;
  3. c=7

       在函数中,没有使用var声明的变量就会从局部变量转为全局变量,也就是说,案例中的b和c此刻都变成了全局变量。

        因此我们在执行fn()这个函数的时候,就会把a,b,c的值都输出出来,也就是3个7。再执行b和c的输出,就把剩下的2个7给输出来。由于a使用了var声明,因此我们的a依然是fn函数里面的局部变量。因此最后的结果自然就是undefined啦。

        最后,函数的提升也就是把所有的函数声明提升到当前作用域的最前面,但不调用函数。

 

 

       

        

        

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号