什么是颞盲区?


Answers:


201

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
}());

图片来源:时间死区(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神秘化ES6 Let,Const和“深度死区”(TDZ)位于深度



@zeroflagL好链接,谢谢。它还说:“没有声明foo,它没有被初始化”,该语言将有助于在上面的答案中进行澄清/更正。 let foo在一个块中引起它被吊起并在该块的顶部声明。该行let foo导致它被初始化。并foo = xyz为其分配一个值。
AJP

2
我认为这是一个很棒的帖子!但是,我给人的印象是“让”没有被吊起吗?我在Mozilla文档中找到了这一点:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference / ... 我并不是想成为一个勾心斗角的人,我只是很好奇,可以公开说明。
dmarges

1
@jeows MDN页面仍然显示未吊起它们。如果您确实确定自己在说什么,则应尝试对其进行编辑。我想我应该提出一个问题。
doubleOrt

1
@joews IMO,您可以说它们已被吊起,但是由于TDZ不能在声明之前被访问,或者您可以说它们未被吊起,但是TDZ会导致对它们的任何引用都引发错误。实际上,这两种说法都是正确的。除了我认为,您是在抽象意义上使用术语“提升”,例如“提升=每当引擎意识到该变量的存在时”。那是为什么呢?另外,规格说明了什么?
doubleOrt

7

吊装:
letconstvar都是GET悬挂过程。
(这意味着它们会上升并在范围的顶部声明。)

初始化:

  • var还要经过初始过程,并获得的初始值undefined
  • 同时letconst没有去扔初始过程,所以他们的价值观仍无法进入,尽管他们已经宣布。什么把它们放进去temporal dead zone

所以不久:

吊装过程:varletconst
初始化过程: var


0

对于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;

在第二个示例中,控制台日志生成“ NaN”(添加undefined和的结果5)。所述declaratationvar a被悬挂,inifialisation代码settng a至5不是。
traktor53

是的,正确,没有任何初始化即可吊起a。因此a将是不确定的。
niranjan harpale,

引用的第一个示例不正确,请更正或删除它。
Spidi的网站
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.