JavaScript中如何提升变量声明

  介绍

这篇文章主要讲解了JavaScript中如何提升变量声明,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

 JavaScript中如何提升变量声明“> <br/> </p> <p>如下代码输出的结果是吗? </p> <pre class= var num=123;   函数foo1 () {   控制台。日志(num);//定义   var num=456;   控制台。日志(num);//456   }   foo1 ();

Javascript代码执行分为两个大步:

预解析的过程
代码的执行过程

1。预解析与变量声明提升

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

<>强声明:

名字的声明,标识符声明(变量名声明)

    <李>名字的声明就是让解析器知道有这个名字李 <>李名字没有任何数据与之对应李

函数的声明

    <李>函数声明包含两部分 <李>

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

    函数f () {}
      函数func(){//函数声明
      }
      如果(真){
      函数func2(){}//函数表达式
      }
      var f=函数func3 () {};//函数表达式
      这一点。sayHello=function () {};//函数表达式
      var i=1;
      函数func4(){}//函数声明
      var=2;
      }
      李,

首先函数声明告诉解析器有这个名字存在,该阶段与名字声明一样
告诉解析器,这个名字对应的函数体是什么

 var num=1;
  函数num () {
  警报(num);
  }
  num ();//报错

<强>分析

    <李>

    预解析代码,提示名字

      <李>首先提升名字num李 <>李再提升函数名,但是名字已经存在,因此只做第二部,让名字与函数体对应上李 <李>结论就是代码中已经有一个函数num了
    <李>

    开始执行代码,第一句话从赋值语句开始执行

      <李>给num赋值为1 <李>覆盖了函数
    <李>调用num,由于num中存储的是数组1,因此报错李

2。代码分析举例

程序1

 var num=123;
  函数foo1 () {
  控制台。日志(num);//定义
  var num=456;
  控制台。日志(num);//456
  }
  foo1 (); 
    <李>预解析,提升num名字和foo1函数李 <>李执行第一句话:<代码> num=123; <李>

    执行函数调用

      <李>函数调用进入函数的一瞬间也要进行预解析,此时解析的是变量名num李 <>李在函数内部是一个独立的空间,允许使用外部的数据,但是现在num声明同名,即覆盖外面的李 <>李执行第一句打印num,没有数据,未定义的 <李>执行第二句赋值:num=456;李 <>李执行第三句打印num,结果456

程序2

如果(! & # 39;一个# 39;在窗口){
  var=123;
  }
  控制台。日志(a); 

首先,预解析,读取提升<代码> ,有一个名字<代码> 存在了

其次,<代码> 运算符:判断某一个字符串描述的属性名是否在对象中

    <李> var o={名称:& # 39;吉姆# 39;};& # 39;名字# 39;o, & # 39;年龄# 39;李李在o <>

    执行第一个判断:!& # 39;一个# 39;在窗口

      <李> & # 39;一个# 39;李在窗口结果为真 <李> !得到假
    <李>如果内部的赋值不进行

最后,打印结果<代码> 的值为<代码>定义

程序3

如果(false) {
  函数f1 () {
  控制台。日志(& # 39;真正的# 39;);
  }
  其他}{
  函数f1 () {
  控制台。日志(& # 39;假# 39;);
  }
  }
  f1 (); 

预解析:提升f1函数,只保留提升后的内容,所以打印是假

执行代码,第一句话就是一个空的如果结构

如果(真){
  其他}{
  }

执行函数调用,得到假

3。问题

函数foo ()} {}
  var foo=function () {}; 

上面的语法是声明,可以提升,因此在函数上方也可以调用

下面的语法是函数表达式,函数名就是foo,他会提升,提升的不是函数体

函数表达式也是支持名字语法

 var foo=函数func1 () {};
  func (); 

函数有一个属性名称,表示的是函数名,只有带有名字的函数定义,才会有名字属性值,否则是"

JavaScript中如何提升变量声明