JavaScript什么是时间死区?
我听说,在初始化之前进行访问let
和const
值会ReferenceError
由于一个称为“ 的原因而导致错误。
什么是时间盲区,它与范围和起重有何关系,在什么情况下会遇到?
回答:
let
与以下内容const
有两个主要区别var
:
- 它们是块作用域的。
var
在声明之前访问a 会有结果undefined
;在声明之前访问alet
或const
throwsReferenceError
:
console.log(aVar); // undefinedconsole.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 ReferenceErrorlet 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 assignedfunction testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.
以上是 JavaScript什么是时间死区? 的全部内容, 来源链接: utcz.com/qa/407834.html