规定:ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。
暂时性死区本质:在let/const块级作用域中 只要出现了用let/const声明的变量 那么在let/const声明语句之前使用 就会出现暂时性死区
分析代码 理解更深入
{
x = 1;
let x =2;
}
在未初始化之前不能访问 我第一次遇到 很迷惑 我没访问啊 哪错了 其实 在let/const块级作用域中 不论 let/const声明的变量在哪一行 在这个块级作用域初始 第一行代码执行前 let/const声明所变量作用域就封su锁了 也就是不能访问 (cannot access) 那什么时候能访问呢 在let 语句后就能访问了 从不能访问到可以访问这段特殊时期 称做“暂时性死区”(temporal dead zone)
{
//x 作用域封锁 不能访问 即TMD开始
x = 1;
let x = 2;//作用域不再封锁 可以访问 即TMD结束
}
l
let a = 1;
function text() {
//变量a 的TMD开始
console.log(a);//Uncaught ReferenceError: Cannot access 'x' before initialization
//触发TMD
let a =2;//变量a的TMD结束
}
我看的有些人以这个例子来说明let有声明提升 我只能说 巧了 其实let没有
let a = 1;
function text() {
let a;
console.log(a);//undefined
a =2;
}