一尘不染

JavaScript什么是时间死区?

javascript

我听说,在初始化之前进行访问letconst值会ReferenceError由于一个称为“ 临时死区” 的原因而导致错误。

什么是时间盲区,它与范围和起重有何关系,在什么情况下会遇到?


阅读 418

收藏
2020-04-25

共1个答案

一尘不染

let与以下内容const有两个主要区别var

  1. 它们是块作用域的。
  2. var在声明之前访问a 会有结果undefined;在声明之前访问a letconstthrows ReferenceError
console.log(aVar); // undefined

console.log(aLet); // causes ReferenceError: aLet is not defined

var aVar = 1;

let aLet = 2;

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

这不是的情况下,however- letconst被悬挂(如varclassfunction),但有输入范围和所声明,他们不能被访问之间的时段。该时间段是时间盲区(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

}());

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.
2020-04-25