js中的预解析与变量名提升问题

来源:互联网 发布:淘宝店掌柜名怎么修改 编辑:程序博客网 时间:2024/06/05 07:17

      在这里,我将细致的讲解与预解析声明和名字提升等相关概念,并用例子来详细分析

      预解析的过程: 程序在执行过程会先将代码读取到内存中检查,会将所有的申明在此时标记,所谓的标记就是让js解析器知道有这个名字,后面使用名字的时候,不会出现未定义的错误,这个标志过程就是提升

      上面所提到的申明包括两个部分:

     1、标识符的申明(就是变量名的申明)

          *在申明变量的时候,前面必须要有关键字var该变量才能提升

          *变量名的申明就是让解析器知道有这个名字的存在并默认将该变量赋值undefined

     2、函数的申明(包括两个部分)

         *首先,函数申明和变量申明一样告诉解析器这个名字的存在

         *然后,告诉解析器这个函数名的函数体是什么

         *函数与表达式有区别,函数申明是单独写在一个结构中,不存在任何语句,逻辑判断中等语句中

 下面用一个例子来分析,与解析和提升以及申明和执行过程

        var  num=123;

       function fun(){

              console.log(num);

               var num=456;

               console.log(num);

           }

           fun();

分析:

 1、预解析,提升名字

   首先提升变量名num;默认赋值为undefined

   然后提升函数名fun以及fun的函数体

2、执行第一句话:

 给num赋值为123 即num=123;

 接着执行函数调用:

     函数调用,进入函数的一瞬间也需要预解析,解析的变量名是num

     在函数体内是一个独立的空间,允许使用外部数据,因为与外部的num重名会将外部的num赋值,并把内部的num先默认赋值为undefined;

    然后执行函数体内的第一句话; 打印num因为num默认赋值为undefined所以先输出undefined

    接着执行函数体内第二句话:给num赋值456及num=456

    然后执行第三句话,打印num,所以再输出456

     所以,先输出undefined再输出456


原创粉丝点击