let和const有两大区别var:他们是
访问
var在声明之前有结果
undefined;访问
let或
const在声明之前抛出
ReferenceError:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
从这些例子看,let声明(和const,它的工作方式是相同的)吊起,因为aLet在分配值之前似乎不存在。
但事实并非如此-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
}());
存取x在内部作用域中,仍然会导致ReferenceError..如果let如果没有吊起,它会伐木outer value.
TDZ是一件好事,因为它有助于突出bug-在声明值之前访问它很少是有意的。
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.
默认情况下,不启用TDZ。babel.js播音器。打开“高遵从性”模式,以便在REPL..提供es6.spec.blockScoping标志用于CLI或库。