Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:如何在if块内提升(或不提升)let?_Javascript_Scope_Ecmascript 6_Var_Let - Fatal编程技术网

Javascript:如何在if块内提升(或不提升)let?

Javascript:如何在if块内提升(或不提升)let?,javascript,scope,ecmascript-6,var,let,Javascript,Scope,Ecmascript 6,Var,Let,在我看来,我已经理解了JavaScript作用域和提升的基本概念。在这方面,这对我帮助很大 不过,最近我遇到了一些事情,这让我有点吃惊。考虑下面的代码: var a = 1; if (true) { console.log(a); let a = 2; } console.log(a); 根据我所学到的知识,我希望它能输出未定义的和1。尽管它会导致未捕获引用错误:未定义a 我的理解是,上述代码应等同于(作为的声明部分,让a=2;应提升到最近的封闭块-在这种情况下,如果,则为): 顺

在我看来,我已经理解了JavaScript作用域和提升的基本概念。在这方面,这对我帮助很大

不过,最近我遇到了一些事情,这让我有点吃惊。考虑下面的代码:

var a = 1;

if (true) {
  console.log(a);
  let a = 2;
}

console.log(a);
根据我所学到的知识,我希望它能输出
未定义的
1
。尽管它会导致
未捕获引用错误:未定义a

我的理解是,上述代码应等同于(作为
的声明部分,让a=2;
应提升到最近的封闭块-在这种情况下,如果
,则为
):

顺便说一下,这段代码会产生
未定义的
1
,正如我所期望的那样


我的问题是:

  • 变量是否在最近的封闭块内用
    let
    吊起?
    • 如果是,为什么第一个块中的代码会导致
      未捕获引用错误:未定义a
    • 有一个称为的句点,它影响用and声明的变量

      释义:

      时间死区-是进入范围和变量之间的一段时间 正在声明,其中无法访问变量

      因此,如果我们要在第一个代码片段中标记时间死区,从以下问题:

      var a = 1;
      
      if (true) {
        /* start of the Temporal Dead Zone */
        console.log(a); /* code in the Temporal Dead Zone */
        /* last line of the Temporal Dead Zone */
        let a = 2; /* end of the Temporal Dead Zone */
      }
      
      console.log(a);
      

      当然,也提到了这一点(以及其他棘手的情况):

      在ECMAScript 2015中,let绑定不受变量提升的约束,这意味着let声明不会移动到当前执行上下文的顶部。在初始化之前引用块中的变量会导致ReferenceError(与使用var声明的变量相反,该变量只具有未定义的值)。从块的开始到初始化处理,变量处于“时间死区”

      上面的摘录后面是以下代码:

      function do_something() {
      console.log(bar); // undefined
      console.log(foo); // ReferenceError
      var bar = 1;
      let foo = 2;
      }
      

      为了明确地解决这个问题:如中所述,使用
      声明的变量在其最近的封闭块内提升,但未初始化。它连续地导致变量行为,好像它们没有被提升=)

      有一个称为的周期,它影响用和声明的变量

      释义:

      时间死区-是进入范围和变量之间的一段时间 正在声明,其中无法访问变量

      因此,如果我们要在第一个代码片段中标记时间死区,从以下问题:

      var a = 1;
      
      if (true) {
        /* start of the Temporal Dead Zone */
        console.log(a); /* code in the Temporal Dead Zone */
        /* last line of the Temporal Dead Zone */
        let a = 2; /* end of the Temporal Dead Zone */
      }
      
      console.log(a);
      

      当然,也提到了这一点(以及其他棘手的情况):

      在ECMAScript 2015中,let绑定不受变量提升的约束,这意味着let声明不会移动到当前执行上下文的顶部。在初始化之前引用块中的变量会导致ReferenceError(与使用var声明的变量相反,该变量只具有未定义的值)。从块的开始到初始化处理,变量处于“时间死区”

      上面的摘录后面是以下代码:

      function do_something() {
      console.log(bar); // undefined
      console.log(foo); // ReferenceError
      var bar = 1;
      let foo = 2;
      }
      


      为了明确地解决这个问题:如中所述,使用
      声明的变量在其最近的封闭块内提升,但未初始化。java,C++,C++,Java……,这是一个非常奇怪的名字,对于一个多语言的AbhinavGauniyal来说,这是一个非常奇怪的名字。名单还在继续。它们都将显示
      变量未定义
      错误,但其中任何一个都不被称为“暂时死区”,因为由于没有提升,这一点非常明显。@AbhinavGauniyal所有这些都没有闭包,不是暂时死区,只是“上面的声明没有用处”。在JavaScript中,您可以执行
      函数示例(){alert(x)}让x=42;示例()
      其中
      x
      在上面的
      let
      范围内。是的,但是从“let绑定不受变量提升”中,我想人们可能会认为let没有被提升(即使声明没有被提升,只是绑定)这是一个非常奇怪的名字,对于一种行为,这是多语言共同的@ AbhinavGauniyal,在什么其他共同语言是这种行为,它是如何被称为“@贝尔吉C,C++,java…名单还在继续。它们都将显示
      变量未定义
      错误,但其中任何一个都不被称为“暂时死区”,因为由于没有提升,这一点非常明显。@AbhinavGauniyal所有这些都没有闭包,不是暂时死区,只是“上面的声明没有用处”。在JavaScript中,您可以执行
      函数示例(){alert(x)}让x=42;示例()
      其中
      x
      在上面的
      let
      范围内。是的,但是从“let绑定不受变量提升”中,我想人们可能会认为let没有被提升(即使声明没有被提升,只是绑定)