ES6之let声明

  • let 的「创建」过程被提升了,但是初始化没有提升,不允许重复声明。
  • var 的「创建」和「初始化」都被提升了。
  • TDZ 暂时死区,就是不能在初始化之前,使用变量。
let x = 'global'
{
  console.log(x) // Uncaught ReferenceError: x is not defined
  let x = 1
}复制代码

console.log(x)报错了,说x没有被定义,说明x指向的是let x = 1声明的x,而不是块代码外的x变量
这就说明了let x = 1声明提升了,你觉得代码应该是这样的:

let x = 'global'
{
  let x
  console.log(x) // Uncaught ReferenceError: x is not defined
  x = 1
}复制代码

因为let x不像var x一样,声明提升随便初始化为undefined,这样理解没毛病,可以接受。但是看到下面这个例子后,我就懵了。

var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}复制代码

按我们上面的理解,代码执行应该是这样的:

var tmp = 123;
if (true) {
  let tmp;
  tmp = 'abc'; // ReferenceError
}复制代码

那么为什么会报错呢,其实是我们理解错了。
let tmp声明确实被提升了,但同时变量tmp也进入了暂时性死区,直到真的执行到let tmp时,变量tmp才被初始化为undefined,这时候我们才可以使用变量tmp

下面这段代码就很好理解TDZ 暂时死区

if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ结束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值