时空死区是什么?

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

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

44705 次浏览

letconstvar有两大不同:

  1. 他们是 块范围
  2. 在声明 var之前访问它的结果是 undefined; 在声明 letconst之前访问它的结果抛出 ReferenceError:

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


var aVar = 1;
let aLet = 2;

从这些示例中可以看出,let声明(以及工作方式相同的 const)可能不是 泳滩悬挂,因为 aLet在被赋值之前似乎不存在。

然而,情况并非如此ーー letconst 已经悬挂(如 varclassfunction) ,但在进入作用域和在无法访问它们的地方被声明之间有一段时间。这个时期是时间死区(TDZ).

aLet声明而不是 分配时,TDZ 结束:

// 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 是一件好事,因为它有助于突出 bug ーー在声明值之前访问该值很少是故意的。

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 解密ES6 Let、 Const 与深度“时间死区”(TDZ)

吊装:
letconstvar都是被吊起的过程。
(什么意思是它们上升到范围的顶部并声明。)

初始化:

  • var也要经过初始过程,得到 undefined的初始值。
  • letconst没有抛出初始进程,所以它们的值仍然不可访问,尽管它们已经声明了。 是什么让他们进入 temporal dead zone

因此,简而言之:

提升过程: varletconst < br/> 初始化过程: var < br/>

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

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

例如,当您无法访问这些变量的值时,它将抛出一个错误。

前男友。

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

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

当我们对变量‘ a’使用 var 时,同样的代码不会出现错误,

前男友。

var sum = a;
console.log(sum)     //prints undefined
var a = 5;