185

我听说在初始化之前访问let和值可能会因为所谓的时间死区而导致。constReferenceError

什么是时间死区,它与范围和提升有什么关系,在什么情况下会遇到?

4

3 回答 3

253

let并与const有两个广泛的区别var

  1. 它们是块作用域的。
  2. var在声明之前访问 a有结果undefined;访问 a letorconst在它被声明之前抛出ReferenceError

console.log(aVar); // undefined
console.log(aLet); // Causes ReferenceError: Cannot access 'aLet' before initialization

var aVar = 1;
let aLet = 2;

从这些示例中可以看出,let声明(和const,其工作方式相同)可能不会被提升,因为aLet在它被赋值之前似乎并不存在。

然而,情况并非如此——<code>let 和const 提升(如var,classfunction),但是在进入作用域和被声明之间有一段时间不能访问它们。这个时期是时间死区(TDZ)

TDZ 在声明而不是赋值aLet时结束:

// console.log(aLet) // Would throw ReferenceError

let aLet;

console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10

此示例显示let已提升:

let x = "outer value";

(function() {
  // Start TDZ for x.
  console.log(x);
  let x = "inner value"; // Declaration ends TDZ for x.
}());

信用:时间死区(TDZ)揭秘

x在内部范围内访问仍然会导致ReferenceError. 如果let没有被吊起,它将记录outer value.

TDZ 是一件好事,因为它有助于突出错误——在声明之前访问一个值很少是有意的。

TDZ 也适用于默认函数参数。参数从左到右计算,每个参数都在 TDZ 中,直到它被分配:

// b is in TDZ until its value is assigned.
function testDefaults(a = b, b) { }

testDefaults(undefined, 1); // Throws ReferenceError because the evaluation of a reads b before it has been evaluated.

babel.js转译器中默认不启用 TDZ 。打开“高合规性”模式以在REPL中使用它。提供es6.spec.blockScoping标志以将其与 CLI 一起使用或用作库。

推荐阅读:TDZ demystifiedES6 Let、Const 和深度中的“时间死区”(TDZ)

于 2015-10-18T14:06:32.780 回答
16

吊装:
let , const,var都是吊装过程。
(这意味着他们走上去并在范围的顶部声明。)

初始化:

  • var也经过初始过程,得到初始值undefined
  • while letconst并没有抛出初始过程,因此尽管它们已经声明,但它们的值仍然无法访问。是什么把它们放进去temporal dead zone

所以很快:

吊装过程: var, let,const
初始化过程: var

于 2019-06-17T10:13:00.500 回答
6

在 let 和 const 变量的情况下,基本上,时间死区是一个区域

“在你的变量被声明之前”,

即在你不能访问这些变量的值的地方,它会抛出一个错误。

前任。

let sum = a + 5;        //---------
//some other code       //         | ------>  this is TDZ for variable a
                        //         |
console.log(sum)        //---------
let a = 5;

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

当我们将 var 用于变量 'a' 时,相同的代码不会出错,

前任。

var sum = a;                            
console.log(sum)     //prints undefined
var a = 5;
于 2019-06-20T10:07:15.087 回答