Javascript 什么是暂时的死区?

Javascript 什么是暂时的死区?,javascript,ecmascript-6,constants,let,Javascript,Ecmascript 6,Constants,Let,我听说在初始化之前访问let和const值会导致ReferenceError,因为有一种叫做时间死区的东西 什么是暂时死区,它与范围和吊装有什么关系,在什么情况下会遇到这种死区?让和const与var有两大区别: 是的 在声明前访问var,结果未定义;在声明之前访问let或const会抛出ReferenceError: console.log(aVar);//未定义 console.log(aLet);//原因引用错误:未定义aLet var aVar=1; 设aLet=2让和const与va

我听说在初始化之前访问
let
const
值会导致
ReferenceError
,因为有一种叫做时间死区的东西


什么是暂时死区,它与范围和吊装有什么关系,在什么情况下会遇到这种死区?

const
var
有两大区别:

  • 是的
  • 在声明前访问
    var
    ,结果
    未定义
    ;在声明之前访问
    let
    const
    会抛出
    ReferenceError
  • console.log(aVar);//未定义
    console.log(aLet);//原因引用错误:未定义aLet
    var aVar=1;
    
    设aLet=2
    const
    var
    有两大区别:

  • 是的
  • 在声明前访问
    var
    ,结果
    未定义
    ;在声明之前访问
    let
    const
    会抛出
    ReferenceError
  • console.log(aVar);//未定义
    console.log(aLet);//原因引用错误:未定义aLet
    var aVar=1;
    
    设aLet=2吊装:
    let
    const
    var
    都是提升过程。
    (这是什么意思?他们往上走,并在范围的顶部声明。)

    初始化:

    • var
      也要完成初始过程,并获取
      未定义的初始值

    • 虽然
      let
      const
      没有抛出初始进程,因此它们的值仍然无法访问,尽管它们已经声明。 是什么让他们进入了时间死区
    所以很快:

    吊装过程:
    var
    let
    const

    初始化过程:
    var


    吊装:
    let
    const
    var
    都是提升过程。
    (这是什么意思?他们往上走,并在范围的顶部声明。)

    初始化:

    • var
      也要完成初始过程,并获取
      未定义的初始值

    • 虽然
      let
      const
      没有抛出初始进程,因此它们的值仍然无法访问,尽管它们已经声明。 是什么让他们进入了时间死区
    所以很快:

    吊装过程:
    var
    let
    const

    初始化过程:
    var


    对于let和const变量,时间死区基本上是一个区域

    “在声明变量之前”

    i、 e如果无法访问这些变量的值,它将抛出一个错误

    上面的代码给出了一个错误

    当我们对变量“a”使用var时,相同的代码不会给出错误


    对于let和const变量,时间死区基本上是一个区域

    “在声明变量之前”

    i、 e如果无法访问这些变量的值,它将抛出一个错误

    上面的代码给出了一个错误

    当我们对变量“a”使用var时,相同的代码不会给出错误


    可能的重复-虽然问题不关注TDZ,但答案基本上是相同的可能重复-虽然问题不关注TDZ,但答案基本上是相同的如此有趣:@zeroflagL好链接,谢谢。它还说:“foo不是未声明的,它是未初始化的”,这种语言有助于澄清/更正上面的答案<代码>让foo
    进入一个区块,使其被提升并在该区块顶部声明。
    let foo
    行使其初始化。而且
    foo=xyz
    会给它赋值。我认为这是一篇很棒的帖子!然而,我的印象是“let”不受吊装影响?我在Mozilla文档中发现了这一点:我不是想成为一个暴躁的人,我只是好奇,并愿意澄清。@jeows MDN页面仍然说他们没有被提升。如果你真的确定你在说什么,你应该试着编辑一下。我想我应该就此发布一个问题。@joews IMO,您可以说它们已被悬挂,但由于TDZ的原因,在其声明到达之前无法访问它们,或者您可以说它们未被悬挂,但TDZ将导致对它们的任何引用抛出错误。实际上,这两种说法都是同样正确的。除此之外,我认为,您在抽象意义上使用术语“提升”,如“提升=当引擎意识到该变量存在时”。这就是为什么?另外,规格上怎么说?也很有趣:@zeroplagl链接不错,谢谢。它还说:“foo不是未声明的,它是未初始化的”,这种语言有助于澄清/更正上面的答案<代码>让foo
    进入一个区块,使其被提升并在该区块顶部声明。
    let foo
    行使其初始化。而且
    foo=xyz
    会给它赋值。我认为这是一篇很棒的帖子!然而,我的印象是“let”不受吊装影响?我在Mozilla文档中发现了这一点:我不是想成为一个暴躁的人,我只是好奇,并愿意澄清。@jeows MDN页面仍然说他们没有被提升。如果你真的确定你在说什么,你应该试着编辑一下。我想我应该发布一个关于这个的问题。@joews IMO,你可以说它们已经悬挂,但由于TDZ的原因,在它们的声明到达之前无法访问它们,或者你可以说它们没有悬挂,但TDZ可以访问它们
    let sum = a + 5;        //---------
    //some other code       //         | ------>  this is TDZ for variable a
                            //         |
    console.log(sum)        //---------
    let a = 5;
    
    var sum = a;                            
    console.log(sum)     //prints undefined
    var a = 5;