ES6 中 let 暂时性死区详解

一、从现象讲起

要讨论暂时性死区,不要着急,我们先从两段代码讲起。

请思考下面这段代码,结果会是什么?

console.log(a)
var a

如果你了解变量提升,那么很容易就会知道,这段代码相当于

var a
console.log(a) // undefined

因此,会输出 undefined

而在 ES6 中,使用 let 命令,会产生什么样的结果呢,我们来尝试修改第一段代码:

console.log(a) // ReferenceError: a is not defined
let a

我们看到,在第一段代码中,只把 var 改成 let 代码就会报错: ReferenceError: a is not defined

原因就是我们忽略了 let 暂时性死区 ( temporal dead zone,简称TDZ )

二、为什么会出现暂时性死区

先来看看 ES6 标准中对 let/const 声明中的解释 第13章,有如下一段文字:

The variables are created when their containing Lexical Environment is instantiated but may not be accessed inany way until the variable’s LexicalBinding is evaluated.

当然这段话我看完也很懵,查阅了一些帖子,翻译成人话就是:

当程序的控制流程在新的作用域( module functionblock 作用域)进行实例化时,在此作用域中用let/const声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。

如果你还是记不住,那么只需理解下面这句话即可:

ES6规定,let/const 命令会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。
总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。
这在语法上,称为 “暂时性死区”( temporal dead zone,简称 TDZ)。

三、其它影响

TDZ 也意味着 typeof 不再是一个百分之百安全的操作。

我们看下面这段代码,

typeof a // ReferenceError: a is not defined
let a

在没有 let 之前,typeof 运算符是百分之百安全的,不会报错。
现在这一点不成立了。
因此,大家应该养成良好的编程习惯,变量一定要在声明之后使用,否则就报错。

?
欢迎纠错,欢迎补充

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值