暂时性死区常见问题

TEMPORAL DEAD ZONE (暂时性死区)

从 es2015 对变量声明的规定中,不难看到tdz的身影,所以什么是tdz?

在查询到的多个结果结合看来:
在let/const,使用函数默认变量时,未完全初始化前的区域,称为暂存死区。


关键字声明后的报错

在新增的关键字中,产生TDZ现象的是:

// let
console.log(a); // throw Reference Error
let a = 1;

// const
console.log(b); // throw Reference Error
const b = 1;

解释: 从 规范 中不难看出,js解释器在进行解释时,预检测到let/const,在本作用域解释流没有到let/const完全解释之前是不可以读/写该变量的。

作用: 存在即是合理,这样的报错,要求变量的声明尽量在作用域的头部,也方便了测试代码的编写,规范代码的格式。

引申问题:

未完全声明时的变量使用

let a = a ; // throw Reference Error: a is not define

函数使用let/const变量

let a = fn(); // throw Reference Error: b is not define
let b = 1;
function fn () {
  return b
}

变量提升

众所皆知,var/function 声明时存在变量提升的效果:

console.log(a); // undefined
var a = 1;

console.log(b); // function b () {}
function b () {}

而let / const 在问题1的示例中直接出现了reference error,那存在变量提升么?

解释这个问题,需要先思考下,什么是变量提升,由变量提升这个问题,会追溯到其来源, JS的生命周期,由这篇文章不难看到,let 在声明阶段时,其实没有和内存中的地址进行绑定,反而是在初始化的阶段,进行的绑定,所以不存在变量提升的情况。

还有什么地方存在TDZ???

函数默认变量

function fn (a = b, b) {
  ...
}
fn(1,2) // throw Reference Error: b is not define

解释: 在使用函数默认变量时,近似于:

function fn () {
   let a = arguments[0];
   let b = arguments[1];
}
// 而上述的例子 可以解释为:
function fn () {
   let a = b;
   let b = arguments[1];
}

所以会出现TDZ的现象。

引用:
1. 我用了两个月的时间才理解 let
2. es规范
3. TEMPORAL DEAD ZONE (TDZ) DEMYSTIFIED

4. MDN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值