什么是颞盲区?


Answers:


201

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

  1. 它们是块作用域的。
  2. var在声明之前访问a 会有结果undefined;在声明之前访问a let或constthrows ReferenceError:

console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;

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

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

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

初始化:

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

所以不久:

吊装过程:var,let,const
初始化过程: 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)。所述declaratation的var 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.