let与以下内容
const有两个主要区别
var:
- 它们是块作用域的。
var
在声明之前访问a 会有结果undefined
;在声明之前访问alet
或const
throwsReferenceError
:
console.log(aVar); // undefinedconsole.log(aLet); // causes ReferenceError: aLet is not definedvar 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); // undefinedaLet = 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.


